@limrun/cli 0.3.1 → 0.4.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 +37 -10
- package/dist/base-command.d.ts +6 -0
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +26 -5
- package/dist/base-command.js.map +1 -1
- package/dist/commands/android/connect.d.ts +1 -0
- package/dist/commands/android/connect.d.ts.map +1 -1
- package/dist/commands/android/create.d.ts +1 -0
- package/dist/commands/android/create.d.ts.map +1 -1
- package/dist/commands/android/create.js +12 -10
- package/dist/commands/android/create.js.map +1 -1
- package/dist/commands/android/delete.d.ts +1 -0
- package/dist/commands/android/delete.d.ts.map +1 -1
- package/dist/commands/android/element-tree.d.ts +14 -1
- package/dist/commands/android/element-tree.d.ts.map +1 -1
- package/dist/commands/android/element-tree.js +59 -6
- package/dist/commands/android/element-tree.js.map +1 -1
- package/dist/commands/android/find-element.d.ts +27 -0
- package/dist/commands/android/find-element.d.ts.map +1 -0
- package/dist/commands/android/find-element.js +72 -0
- package/dist/commands/android/find-element.js.map +1 -0
- package/dist/commands/android/get.d.ts +1 -0
- package/dist/commands/android/get.d.ts.map +1 -1
- package/dist/commands/android/install-app.d.ts +16 -1
- package/dist/commands/android/install-app.d.ts.map +1 -1
- package/dist/commands/android/install-app.js +66 -3
- package/dist/commands/android/install-app.js.map +1 -1
- package/dist/commands/android/list.d.ts +1 -0
- package/dist/commands/android/list.d.ts.map +1 -1
- package/dist/commands/android/open-url.d.ts +16 -1
- package/dist/commands/android/open-url.d.ts.map +1 -1
- package/dist/commands/android/open-url.js +50 -6
- package/dist/commands/android/open-url.js.map +1 -1
- package/dist/commands/android/press-key.d.ts +17 -1
- package/dist/commands/android/press-key.d.ts.map +1 -1
- package/dist/commands/android/press-key.js +51 -6
- package/dist/commands/android/press-key.js.map +1 -1
- package/dist/commands/android/record.d.ts +20 -1
- package/dist/commands/android/record.d.ts.map +1 -1
- package/dist/commands/android/record.js +99 -3
- package/dist/commands/android/record.js.map +1 -1
- package/dist/commands/android/screenshot.d.ts +15 -1
- package/dist/commands/android/screenshot.d.ts.map +1 -1
- package/dist/commands/android/screenshot.js +64 -3
- package/dist/commands/android/screenshot.js.map +1 -1
- package/dist/commands/android/scroll.d.ts +30 -1
- package/dist/commands/android/scroll.d.ts.map +1 -1
- package/dist/commands/android/scroll.js +70 -6
- package/dist/commands/android/scroll.js.map +1 -1
- package/dist/commands/android/tap-element.d.ts +25 -1
- package/dist/commands/android/tap-element.d.ts.map +1 -1
- package/dist/commands/android/tap-element.js +59 -6
- package/dist/commands/android/tap-element.js.map +1 -1
- package/dist/commands/android/tap.d.ts +23 -1
- package/dist/commands/android/tap.d.ts.map +1 -1
- package/dist/commands/android/tap.js +54 -6
- package/dist/commands/android/tap.js.map +1 -1
- package/dist/commands/android/type.d.ts +29 -1
- package/dist/commands/android/type.d.ts.map +1 -1
- package/dist/commands/android/type.js +52 -6
- package/dist/commands/android/type.js.map +1 -1
- package/dist/commands/asset/delete.d.ts +1 -0
- package/dist/commands/asset/delete.d.ts.map +1 -1
- package/dist/commands/asset/list.d.ts +2 -0
- package/dist/commands/asset/list.d.ts.map +1 -1
- package/dist/commands/asset/list.js +6 -0
- package/dist/commands/asset/list.js.map +1 -1
- package/dist/commands/asset/pull.d.ts +1 -0
- package/dist/commands/asset/pull.d.ts.map +1 -1
- package/dist/commands/asset/pull.js +2 -2
- package/dist/commands/asset/pull.js.map +1 -1
- package/dist/commands/asset/push.d.ts +1 -0
- package/dist/commands/asset/push.d.ts.map +1 -1
- package/dist/commands/asset/push.js +2 -3
- package/dist/commands/asset/push.js.map +1 -1
- package/dist/commands/exec/element-tree.d.ts +1 -0
- package/dist/commands/exec/element-tree.d.ts.map +1 -1
- package/dist/commands/exec/install-app.d.ts +1 -0
- package/dist/commands/exec/install-app.d.ts.map +1 -1
- package/dist/commands/exec/install-app.js +1 -1
- package/dist/commands/exec/install-app.js.map +1 -1
- package/dist/commands/exec/open-url.d.ts +1 -0
- package/dist/commands/exec/open-url.d.ts.map +1 -1
- package/dist/commands/exec/perform.d.ts +1 -0
- package/dist/commands/exec/perform.d.ts.map +1 -1
- package/dist/commands/exec/press-key.d.ts +1 -0
- package/dist/commands/exec/press-key.d.ts.map +1 -1
- package/dist/commands/exec/record.d.ts +1 -0
- package/dist/commands/exec/record.d.ts.map +1 -1
- package/dist/commands/exec/screenshot.d.ts +1 -0
- package/dist/commands/exec/screenshot.d.ts.map +1 -1
- package/dist/commands/exec/scroll.d.ts +1 -0
- package/dist/commands/exec/scroll.d.ts.map +1 -1
- package/dist/commands/exec/tap-element.d.ts +1 -0
- package/dist/commands/exec/tap-element.d.ts.map +1 -1
- package/dist/commands/exec/tap.d.ts +1 -0
- package/dist/commands/exec/tap.d.ts.map +1 -1
- package/dist/commands/exec/type.d.ts +1 -0
- package/dist/commands/exec/type.d.ts.map +1 -1
- package/dist/commands/ios/app-log.d.ts +19 -0
- package/dist/commands/ios/app-log.d.ts.map +1 -0
- package/dist/commands/ios/app-log.js +93 -0
- package/dist/commands/ios/app-log.js.map +1 -0
- package/dist/commands/ios/cp.d.ts +18 -0
- package/dist/commands/ios/cp.d.ts.map +1 -0
- package/dist/commands/ios/cp.js +66 -0
- package/dist/commands/ios/cp.js.map +1 -0
- package/dist/commands/ios/create.d.ts +1 -0
- package/dist/commands/ios/create.d.ts.map +1 -1
- package/dist/commands/ios/create.js +27 -13
- package/dist/commands/ios/create.js.map +1 -1
- package/dist/commands/ios/delete.d.ts +1 -0
- package/dist/commands/ios/delete.d.ts.map +1 -1
- package/dist/commands/ios/element-tree.d.ts +14 -1
- package/dist/commands/ios/element-tree.d.ts.map +1 -1
- package/dist/commands/ios/element-tree.js +56 -6
- package/dist/commands/ios/element-tree.js.map +1 -1
- package/dist/commands/ios/get.d.ts +1 -0
- package/dist/commands/ios/get.d.ts.map +1 -1
- package/dist/commands/ios/info.d.ts +1 -0
- package/dist/commands/ios/info.d.ts.map +1 -1
- package/dist/commands/ios/install-app.d.ts +18 -1
- package/dist/commands/ios/install-app.d.ts.map +1 -1
- package/dist/commands/ios/install-app.js +93 -3
- package/dist/commands/ios/install-app.js.map +1 -1
- package/dist/commands/ios/launch-app.d.ts +1 -0
- package/dist/commands/ios/launch-app.d.ts.map +1 -1
- package/dist/commands/ios/list-apps.d.ts +1 -0
- package/dist/commands/ios/list-apps.d.ts.map +1 -1
- package/dist/commands/ios/list.d.ts +1 -0
- package/dist/commands/ios/list.d.ts.map +1 -1
- package/dist/commands/ios/log.d.ts +2 -0
- package/dist/commands/ios/log.d.ts.map +1 -1
- package/dist/commands/ios/log.js +16 -5
- package/dist/commands/ios/log.js.map +1 -1
- package/dist/commands/ios/lsof.d.ts +15 -0
- package/dist/commands/ios/lsof.d.ts.map +1 -0
- package/dist/commands/ios/lsof.js +49 -0
- package/dist/commands/ios/lsof.js.map +1 -0
- package/dist/commands/ios/open-url.d.ts +16 -1
- package/dist/commands/ios/open-url.d.ts.map +1 -1
- package/dist/commands/ios/open-url.js +50 -6
- package/dist/commands/ios/open-url.js.map +1 -1
- package/dist/commands/ios/perform.d.ts +16 -1
- package/dist/commands/ios/perform.d.ts.map +1 -1
- package/dist/commands/ios/perform.js +224 -3
- package/dist/commands/ios/perform.js.map +1 -1
- package/dist/commands/ios/press-key.d.ts +17 -1
- package/dist/commands/ios/press-key.d.ts.map +1 -1
- package/dist/commands/ios/press-key.js +51 -6
- package/dist/commands/ios/press-key.js.map +1 -1
- package/dist/commands/ios/record.d.ts +20 -1
- package/dist/commands/ios/record.d.ts.map +1 -1
- package/dist/commands/ios/record.js +100 -3
- package/dist/commands/ios/record.js.map +1 -1
- package/dist/commands/ios/screenshot.d.ts +15 -1
- package/dist/commands/ios/screenshot.d.ts.map +1 -1
- package/dist/commands/ios/screenshot.js +63 -3
- package/dist/commands/ios/screenshot.js.map +1 -1
- package/dist/commands/ios/scroll.d.ts +17 -1
- package/dist/commands/ios/scroll.d.ts.map +1 -1
- package/dist/commands/ios/scroll.js +55 -6
- package/dist/commands/ios/scroll.js.map +1 -1
- package/dist/commands/ios/simctl.d.ts +16 -0
- package/dist/commands/ios/simctl.d.ts.map +1 -0
- package/dist/commands/ios/simctl.js +75 -0
- package/dist/commands/ios/simctl.js.map +1 -0
- package/dist/commands/ios/sync.d.ts +3 -0
- package/dist/commands/ios/sync.d.ts.map +1 -1
- package/dist/commands/ios/sync.js +13 -4
- package/dist/commands/ios/sync.js.map +1 -1
- package/dist/commands/ios/syslog.d.ts +15 -0
- package/dist/commands/ios/syslog.d.ts.map +1 -0
- package/dist/commands/ios/syslog.js +65 -0
- package/dist/commands/ios/syslog.js.map +1 -0
- package/dist/commands/ios/tap-element.d.ts +21 -1
- package/dist/commands/ios/tap-element.d.ts.map +1 -1
- package/dist/commands/ios/tap-element.js +91 -6
- package/dist/commands/ios/tap-element.js.map +1 -1
- package/dist/commands/ios/tap.d.ts +23 -1
- package/dist/commands/ios/tap.d.ts.map +1 -1
- package/dist/commands/ios/tap.js +54 -6
- package/dist/commands/ios/tap.js.map +1 -1
- package/dist/commands/ios/terminate-app.d.ts +1 -0
- package/dist/commands/ios/terminate-app.d.ts.map +1 -1
- package/dist/commands/ios/type.d.ts +17 -1
- package/dist/commands/ios/type.d.ts.map +1 -1
- package/dist/commands/ios/type.js +52 -6
- package/dist/commands/ios/type.js.map +1 -1
- package/dist/commands/ios/xcodebuild.d.ts +16 -0
- package/dist/commands/ios/xcodebuild.d.ts.map +1 -0
- package/dist/commands/ios/xcodebuild.js +61 -0
- package/dist/commands/ios/xcodebuild.js.map +1 -0
- package/dist/commands/ios/xcrun.d.ts +16 -0
- package/dist/commands/ios/xcrun.d.ts.map +1 -0
- package/dist/commands/ios/xcrun.js +62 -0
- package/dist/commands/ios/xcrun.js.map +1 -0
- package/dist/commands/login.d.ts +7 -2
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +5 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +7 -2
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +5 -2
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/session/start.d.ts +1 -0
- package/dist/commands/session/start.d.ts.map +1 -1
- package/dist/commands/session/status.d.ts +1 -0
- package/dist/commands/session/status.d.ts.map +1 -1
- package/dist/commands/session/stop.d.ts +5 -2
- package/dist/commands/session/stop.d.ts.map +1 -1
- package/dist/commands/session/stop.js +4 -2
- package/dist/commands/session/stop.js.map +1 -1
- package/dist/commands/xcode/build.d.ts +4 -0
- package/dist/commands/xcode/build.d.ts.map +1 -1
- package/dist/commands/xcode/build.js +24 -5
- package/dist/commands/xcode/build.js.map +1 -1
- package/dist/commands/xcode/create.d.ts +1 -0
- package/dist/commands/xcode/create.d.ts.map +1 -1
- package/dist/commands/xcode/create.js +13 -7
- package/dist/commands/xcode/create.js.map +1 -1
- package/dist/commands/xcode/delete.d.ts +1 -0
- package/dist/commands/xcode/delete.d.ts.map +1 -1
- package/dist/commands/xcode/get.d.ts +1 -0
- package/dist/commands/xcode/get.d.ts.map +1 -1
- package/dist/commands/xcode/list.d.ts +1 -0
- package/dist/commands/xcode/list.d.ts.map +1 -1
- package/dist/commands/xcode/sync.d.ts +4 -0
- package/dist/commands/xcode/sync.d.ts.map +1 -1
- package/dist/commands/xcode/sync.js +19 -3
- package/dist/commands/xcode/sync.js.map +1 -1
- package/dist/lib/android-selector.d.ts +50 -0
- package/dist/lib/android-selector.d.ts.map +1 -0
- package/dist/lib/android-selector.js +103 -0
- package/dist/lib/android-selector.js.map +1 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/daemon.js +25 -3
- package/dist/lib/daemon.js.map +1 -1
- package/dist/lib/ignore-patterns.d.ts +2 -0
- package/dist/lib/ignore-patterns.d.ts.map +1 -0
- package/dist/lib/ignore-patterns.js +18 -0
- package/dist/lib/ignore-patterns.js.map +1 -0
- package/package.json +3 -6
|
@@ -3,7 +3,228 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
8
|
+
const core_1 = require("@oclif/core");
|
|
9
|
+
const base_command_1 = require("../../base-command");
|
|
10
|
+
const instance_client_factory_1 = require("../../lib/instance-client-factory");
|
|
11
|
+
const IPC_TIMEOUT_BUFFER_MS = 5000;
|
|
12
|
+
function splitActionFields(raw) {
|
|
13
|
+
const fields = [];
|
|
14
|
+
let current = '';
|
|
15
|
+
let escaped = false;
|
|
16
|
+
for (const char of raw) {
|
|
17
|
+
if (escaped) {
|
|
18
|
+
current += char;
|
|
19
|
+
escaped = false;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (char === '\\') {
|
|
23
|
+
escaped = true;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (char === ',') {
|
|
27
|
+
fields.push(current);
|
|
28
|
+
current = '';
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
current += char;
|
|
32
|
+
}
|
|
33
|
+
if (escaped) {
|
|
34
|
+
current += '\\';
|
|
35
|
+
}
|
|
36
|
+
fields.push(current);
|
|
37
|
+
return fields;
|
|
38
|
+
}
|
|
39
|
+
function parseScalarValue(value) {
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
if ((trimmed.startsWith('{') && trimmed.endsWith('}')) ||
|
|
42
|
+
(trimmed.startsWith('[') && trimmed.endsWith(']')) ||
|
|
43
|
+
(trimmed.startsWith('"') && trimmed.endsWith('"'))) {
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(trimmed);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Fall through to plain string parsing if this is not valid JSON.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (value === 'true')
|
|
52
|
+
return true;
|
|
53
|
+
if (value === 'false')
|
|
54
|
+
return false;
|
|
55
|
+
if (/^-?\d+(\.\d+)?$/.test(value))
|
|
56
|
+
return Number(value);
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
function parseAction(raw, index) {
|
|
60
|
+
const action = {};
|
|
61
|
+
for (const field of splitActionFields(raw)) {
|
|
62
|
+
const trimmed = field.trim();
|
|
63
|
+
if (!trimmed)
|
|
64
|
+
continue;
|
|
65
|
+
const equalsIndex = trimmed.indexOf('=');
|
|
66
|
+
if (equalsIndex === -1) {
|
|
67
|
+
throw new Error(`Action ${index + 1} field "${trimmed}" must use key=value syntax`);
|
|
68
|
+
}
|
|
69
|
+
const key = trimmed.slice(0, equalsIndex).trim();
|
|
70
|
+
const value = trimmed.slice(equalsIndex + 1);
|
|
71
|
+
if (!key) {
|
|
72
|
+
throw new Error(`Action ${index + 1} contains an empty key`);
|
|
73
|
+
}
|
|
74
|
+
action[key] = parseScalarValue(value);
|
|
75
|
+
}
|
|
76
|
+
if (typeof action.type !== 'string' || action.type.length === 0) {
|
|
77
|
+
throw new Error(`Action ${index + 1} must include type=<action-name>`);
|
|
78
|
+
}
|
|
79
|
+
return action;
|
|
80
|
+
}
|
|
81
|
+
function parseActionsDocument(raw, source) {
|
|
82
|
+
let parsed;
|
|
83
|
+
try {
|
|
84
|
+
parsed = js_yaml_1.default.load(raw);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw new Error(`Failed to parse actions from ${source}: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
if (!Array.isArray(parsed)) {
|
|
90
|
+
throw new Error(`Actions in ${source} must be an array`);
|
|
91
|
+
}
|
|
92
|
+
for (const [index, action] of parsed.entries()) {
|
|
93
|
+
if (!action || typeof action !== 'object' || typeof action.type !== 'string') {
|
|
94
|
+
throw new Error(`Action at index ${index} in ${source} must be an object with a string "type" field`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return parsed;
|
|
98
|
+
}
|
|
99
|
+
function parseActions(rawActions) {
|
|
100
|
+
if (rawActions.length === 0) {
|
|
101
|
+
throw new Error('Provide at least one --action flag');
|
|
102
|
+
}
|
|
103
|
+
return rawActions.map((rawAction, index) => parseAction(rawAction, index));
|
|
104
|
+
}
|
|
105
|
+
async function readActions(flags) {
|
|
106
|
+
const hasInlineActions = (flags.action?.length ?? 0) > 0;
|
|
107
|
+
const hasFile = typeof flags.file === 'string';
|
|
108
|
+
if (!hasInlineActions && !hasFile) {
|
|
109
|
+
throw new Error('Provide either at least one --action flag or --file');
|
|
110
|
+
}
|
|
111
|
+
if (hasInlineActions && hasFile) {
|
|
112
|
+
throw new Error('Use either --action or --file, not both');
|
|
113
|
+
}
|
|
114
|
+
if (hasInlineActions) {
|
|
115
|
+
return parseActions(flags.action);
|
|
116
|
+
}
|
|
117
|
+
const raw = await fs_1.default.promises.readFile(flags.file, 'utf-8');
|
|
118
|
+
return parseActionsDocument(raw, flags.file);
|
|
119
|
+
}
|
|
120
|
+
function estimateTimeoutMs(actions, overrideTimeoutMs) {
|
|
121
|
+
if (overrideTimeoutMs !== undefined) {
|
|
122
|
+
return overrideTimeoutMs;
|
|
123
|
+
}
|
|
124
|
+
const waitMs = actions.reduce((total, action) => {
|
|
125
|
+
if (action.type !== 'wait' || typeof action.durationMs !== 'number') {
|
|
126
|
+
return total;
|
|
127
|
+
}
|
|
128
|
+
return total + Math.max(0, action.durationMs);
|
|
129
|
+
}, 0);
|
|
130
|
+
return 30000 + waitMs + actions.length * 2000;
|
|
131
|
+
}
|
|
132
|
+
class IosPerform extends base_command_1.BaseCommand {
|
|
133
|
+
async run() {
|
|
134
|
+
const { flags } = await this.parse(IosPerform);
|
|
135
|
+
this.setParsedFlags(flags);
|
|
136
|
+
await this.withAuth(async () => {
|
|
137
|
+
const id = this.resolveId(flags.id);
|
|
138
|
+
if ((0, instance_client_factory_1.detectInstanceType)(id) !== 'ios') {
|
|
139
|
+
this.error('ios perform only supports iOS instances');
|
|
140
|
+
}
|
|
141
|
+
const actions = await readActions(flags);
|
|
142
|
+
const timeoutMs = estimateTimeoutMs(actions, flags.timeout);
|
|
143
|
+
const ipcTimeoutMs = timeoutMs + IPC_TIMEOUT_BUFFER_MS;
|
|
144
|
+
let result;
|
|
145
|
+
if ((0, instance_client_factory_1.hasActiveSession)(id)) {
|
|
146
|
+
result = (await (0, instance_client_factory_1.sendSessionCommand)(id, 'perform-actions', [actions, flags.timeout], ipcTimeoutMs));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const { type, client, disconnect } = await (0, instance_client_factory_1.getInstanceClient)(this.client, id);
|
|
150
|
+
try {
|
|
151
|
+
if (type !== 'ios') {
|
|
152
|
+
this.error('ios perform only supports iOS instances');
|
|
153
|
+
}
|
|
154
|
+
result = (await client.performActions(actions, flags.timeout !== undefined ? { timeoutMs: flags.timeout } : undefined));
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
disconnect();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (flags.json) {
|
|
161
|
+
this.outputJson(result);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.log(`Performed ${result.results.length} action${result.results.length === 1 ? '' : 's'}`);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
IosPerform.summary = 'Perform multiple iOS actions in a single batch';
|
|
170
|
+
IosPerform.description = 'Run a batch of iOS actions in a single CLI invocation using repeated `--action` flags or a JSON/YAML action file. This is the best choice for agent-driven multi-step interactions that should execute without reconnecting between steps.';
|
|
171
|
+
IosPerform.examples = [
|
|
172
|
+
'<%= config.bin %> ios perform --action type=tap,x=100,y=200 --action "type=typeText,text=Hello World"',
|
|
173
|
+
'<%= config.bin %> ios perform --action type=wait,durationMs=1000 --action type=pressKey,key=enter',
|
|
174
|
+
'<%= config.bin %> ios perform --file ./actions.yaml',
|
|
175
|
+
];
|
|
176
|
+
IosPerform.flags = {
|
|
177
|
+
...base_command_1.BaseCommand.baseFlags,
|
|
178
|
+
id: core_1.Flags.string({
|
|
179
|
+
description: 'iOS instance ID to target. Defaults to the last created iOS instance.',
|
|
180
|
+
}),
|
|
181
|
+
action: core_1.Flags.string({
|
|
182
|
+
description: `Action definition as comma-separated key=value pairs; repeat for multiple actions.
|
|
183
|
+
|
|
184
|
+
Available action types:
|
|
185
|
+
- Tap on coordinate: type=tap,x=100,y=200
|
|
186
|
+
- Tap on element by using a selector: type=tapElement,selector={"AXLabel":"Submit"}
|
|
187
|
+
- Increment an element by using a selector: type=incrementElement,selector={"AXLabel":"Volume"}
|
|
188
|
+
- Decrement an element by using a selector: type=decrementElement,selector={"AXLabel":"Volume"}
|
|
189
|
+
- Set an element value by using a selector: type=setElementValue,text=42,selector={"AXLabel":"Counter"}
|
|
190
|
+
- Type text into the focused field: type=typeText,text=Hello World,pressEnter=true
|
|
191
|
+
- Press a key with optional modifiers: type=pressKey,key=a,modifiers=["shift"]
|
|
192
|
+
- Scroll the screen: type=scroll,direction=down,pixels=300,coordinate=[200,400],momentum=0.2
|
|
193
|
+
- Toggle the software keyboard: type=toggleKeyboard
|
|
194
|
+
- Open a URL or deep link: type=openUrl,url=https://example.com
|
|
195
|
+
- Set device orientation: type=setOrientation,orientation=Landscape
|
|
196
|
+
- Wait before the next action: type=wait,durationMs=1000
|
|
197
|
+
- Start a touch gesture: type=touchDown,x=100,y=200
|
|
198
|
+
- Move a touch gesture: type=touchMove,x=120,y=220
|
|
199
|
+
- End a touch gesture: type=touchUp,x=120,y=220
|
|
200
|
+
- Press a raw key code down: type=keyDown,keyCode=4
|
|
201
|
+
- Release a raw key code: type=keyUp,keyCode=4
|
|
202
|
+
- Press a hardware button down: type=buttonDown,button=home
|
|
203
|
+
- Release a hardware button: type=buttonUp,button=home
|
|
204
|
+
|
|
205
|
+
Use JSON values for complex fields like selector, modifiers, and coordinate.`,
|
|
206
|
+
multiple: true,
|
|
207
|
+
}),
|
|
208
|
+
file: core_1.Flags.string({
|
|
209
|
+
char: 'f',
|
|
210
|
+
description: `Path to a YAML or JSON file containing an array of action objects.
|
|
211
|
+
|
|
212
|
+
JSON example:
|
|
213
|
+
[
|
|
214
|
+
{ "type": "tap", "x": 100, "y": 200 },
|
|
215
|
+
{ "type": "typeText", "text": "Hello World" }
|
|
216
|
+
]
|
|
217
|
+
|
|
218
|
+
YAML example:
|
|
219
|
+
- type: tap
|
|
220
|
+
x: 100
|
|
221
|
+
y: 200
|
|
222
|
+
- type: typeText
|
|
223
|
+
text: "Hello World"`,
|
|
224
|
+
}),
|
|
225
|
+
timeout: core_1.Flags.integer({
|
|
226
|
+
description: 'Override the total batch timeout in milliseconds. By default the CLI grows the timeout based on waits and action count.',
|
|
227
|
+
}),
|
|
228
|
+
};
|
|
229
|
+
exports.default = IosPerform;
|
|
9
230
|
//# sourceMappingURL=perform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perform.js","sourceRoot":"","sources":["../../../src/commands/ios/perform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"perform.js","sourceRoot":"","sources":["../../../src/commands/ios/perform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { BaseCommand } from '../../base-command';
|
|
2
|
+
export default class IosPressKey extends BaseCommand {
|
|
3
|
+
static summary: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {
|
|
7
|
+
key: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
modifier: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
2
18
|
//# sourceMappingURL=press-key.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"press-key.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/press-key.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"press-key.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/press-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,MAAM,CAAC,OAAO,SAA2C;IACzD,MAAM,CAAC,WAAW,SACoJ;IACtK,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,IAAI;;MAET;IAEF,MAAM,CAAC,KAAK;;;;;;MAUV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B3B"}
|
|
@@ -1,9 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const base_command_1 = require("../../base-command");
|
|
5
|
+
const instance_client_factory_1 = require("../../lib/instance-client-factory");
|
|
6
|
+
class IosPressKey extends base_command_1.BaseCommand {
|
|
7
|
+
async run() {
|
|
8
|
+
const { args, flags } = await this.parse(IosPressKey);
|
|
9
|
+
this.setParsedFlags(flags);
|
|
10
|
+
await this.withAuth(async () => {
|
|
11
|
+
const id = this.resolveId(flags.id);
|
|
12
|
+
if ((0, instance_client_factory_1.detectInstanceType)(id) !== 'ios') {
|
|
13
|
+
this.error('ios press-key only supports iOS instances');
|
|
14
|
+
}
|
|
15
|
+
if ((0, instance_client_factory_1.hasActiveSession)(id)) {
|
|
16
|
+
await (0, instance_client_factory_1.sendSessionCommand)(id, 'press-key', [args.key, flags.modifier]);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const { type, client, disconnect } = await (0, instance_client_factory_1.getInstanceClient)(this.client, id);
|
|
20
|
+
try {
|
|
21
|
+
if (type !== 'ios') {
|
|
22
|
+
this.error('ios press-key only supports iOS instances');
|
|
23
|
+
}
|
|
24
|
+
await client.pressKey(args.key, flags.modifier);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
disconnect();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
this.log(`Pressed key: ${args.key}`);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
IosPressKey.summary = 'Press a key on a running iOS instance';
|
|
35
|
+
IosPressKey.description = 'Send a keyboard key press to the focused app or text field on a running iOS instance. You can repeat `--modifier` to combine keys such as Command, Shift, or Alt.';
|
|
36
|
+
IosPressKey.examples = [
|
|
37
|
+
'<%= config.bin %> ios press-key enter',
|
|
38
|
+
'<%= config.bin %> ios press-key a --modifier shift --id <instance-ID>',
|
|
39
|
+
];
|
|
40
|
+
IosPressKey.args = {
|
|
41
|
+
key: core_1.Args.string({ description: 'Key to press (e.g. enter, backspace, a, f1)', required: true }),
|
|
42
|
+
};
|
|
43
|
+
IosPressKey.flags = {
|
|
44
|
+
...base_command_1.BaseCommand.baseFlags,
|
|
45
|
+
id: core_1.Flags.string({
|
|
46
|
+
description: 'iOS instance ID to target. Defaults to the last created iOS instance.',
|
|
47
|
+
}),
|
|
48
|
+
modifier: core_1.Flags.string({
|
|
49
|
+
description: 'Modifier key to hold during the press, such as shift, command, control, or alt. Repeat for multiple modifiers.',
|
|
50
|
+
multiple: true,
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
exports.default = IosPressKey;
|
|
9
54
|
//# sourceMappingURL=press-key.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"press-key.js","sourceRoot":"","sources":["../../../src/commands/ios/press-key.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"press-key.js","sourceRoot":"","sources":["../../../src/commands/ios/press-key.ts"],"names":[],"mappings":";;AAAA,sCAA0C;AAC1C,qDAAiD;AACjD,+EAK2C;AAE3C,MAAqB,WAAY,SAAQ,0BAAW;IAyBlD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,IAAA,4CAAkB,EAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,IAAA,0CAAgB,EAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAA,4CAAkB,EAAC,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,2CAAiB,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC;oBACH,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;wBACnB,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;oBAC1D,CAAC;oBACD,MAAO,MAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3D,CAAC;wBAAS,CAAC;oBACT,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;;AAjDM,mBAAO,GAAG,uCAAuC,CAAC;AAClD,uBAAW,GAChB,mKAAmK,CAAC;AAC/J,oBAAQ,GAAG;IAChB,uCAAuC;IACvC,uEAAuE;CACxE,CAAC;AAEK,gBAAI,GAAG;IACZ,GAAG,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACjG,CAAC;AAEK,iBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,uEAAuE;KACrF,CAAC;IACF,QAAQ,EAAE,YAAK,CAAC,MAAM,CAAC;QACrB,WAAW,EACT,gHAAgH;QAClH,QAAQ,EAAE,IAAI;KACf,CAAC;CACH,CAAC;kBAvBiB,WAAW"}
|
|
@@ -1,2 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { BaseCommand } from '../../base-command';
|
|
2
|
+
export default class IosRecord extends BaseCommand {
|
|
3
|
+
static summary: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {
|
|
7
|
+
action: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
quality: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
output: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
'presigned-url': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
14
|
+
'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
15
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
};
|
|
18
|
+
run(): Promise<void>;
|
|
19
|
+
private defaultRecordingPath;
|
|
20
|
+
}
|
|
2
21
|
//# sourceMappingURL=record.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/record.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/record.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA6D;IAC3E,MAAM,CAAC,WAAW,SAC4J;IAC9K,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,IAAI;;MAOT;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAmBV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D1B,OAAO,CAAC,oBAAoB;CAI7B"}
|
|
@@ -3,7 +3,104 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const core_1 = require("@oclif/core");
|
|
8
|
+
const base_command_1 = require("../../base-command");
|
|
9
|
+
const instance_client_factory_1 = require("../../lib/instance-client-factory");
|
|
10
|
+
class IosRecord extends base_command_1.BaseCommand {
|
|
11
|
+
async run() {
|
|
12
|
+
const { args, flags } = await this.parse(IosRecord);
|
|
13
|
+
this.setParsedFlags(flags);
|
|
14
|
+
await this.withAuth(async () => {
|
|
15
|
+
const id = this.resolveId(flags.id);
|
|
16
|
+
if ((0, instance_client_factory_1.detectInstanceType)(id) !== 'ios') {
|
|
17
|
+
this.error('ios record only supports iOS instances');
|
|
18
|
+
}
|
|
19
|
+
if (args.action === 'start') {
|
|
20
|
+
if ((0, instance_client_factory_1.hasActiveSession)(id)) {
|
|
21
|
+
await (0, instance_client_factory_1.sendSessionCommand)(id, 'start-recording', [flags.quality]);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const { type, client, disconnect } = await (0, instance_client_factory_1.getInstanceClient)(this.client, id);
|
|
25
|
+
try {
|
|
26
|
+
if (type !== 'ios') {
|
|
27
|
+
this.error('ios record only supports iOS instances');
|
|
28
|
+
}
|
|
29
|
+
await client.startRecording({ quality: flags.quality });
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
disconnect();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
this.log('Recording started');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const outputPath = flags.output ? path_1.default.resolve(flags.output) : this.defaultRecordingPath();
|
|
39
|
+
const saveTo = {
|
|
40
|
+
localPath: outputPath,
|
|
41
|
+
presignedUrl: flags['presigned-url'],
|
|
42
|
+
};
|
|
43
|
+
if ((0, instance_client_factory_1.hasActiveSession)(id)) {
|
|
44
|
+
await (0, instance_client_factory_1.sendSessionCommand)(id, 'stop-recording', [saveTo]);
|
|
45
|
+
this.log(`Recording saved to ${outputPath}`);
|
|
46
|
+
if (flags['presigned-url']) {
|
|
47
|
+
this.log('Recording uploaded using the provided presigned URL');
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const { type, client, disconnect } = await (0, instance_client_factory_1.getInstanceClient)(this.client, id);
|
|
52
|
+
try {
|
|
53
|
+
if (type !== 'ios') {
|
|
54
|
+
this.error('ios record only supports iOS instances');
|
|
55
|
+
}
|
|
56
|
+
await client.stopRecording(saveTo);
|
|
57
|
+
this.log(`Recording saved to ${outputPath}`);
|
|
58
|
+
if (flags['presigned-url']) {
|
|
59
|
+
this.log('Recording uploaded using the provided presigned URL');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
disconnect();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
defaultRecordingPath() {
|
|
68
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
69
|
+
return path_1.default.join(process.cwd(), `video_${timestamp}.mp4`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
IosRecord.summary = 'Start or stop video recording on a running iOS instance';
|
|
73
|
+
IosRecord.description = 'Control screen recording on a running iOS instance. Start recording first, then stop recording to download the file locally or upload it directly with `--presigned-url`.';
|
|
74
|
+
IosRecord.examples = [
|
|
75
|
+
'<%= config.bin %> ios record start',
|
|
76
|
+
'<%= config.bin %> ios record stop',
|
|
77
|
+
'<%= config.bin %> ios record stop -o recording.mp4 --id <instance-ID>',
|
|
78
|
+
'<%= config.bin %> ios record stop --presigned-url https://example.com/upload --id <instance-ID>',
|
|
79
|
+
'<%= config.bin %> ios record start --quality 8',
|
|
80
|
+
];
|
|
81
|
+
IosRecord.args = {
|
|
82
|
+
action: core_1.Args.string({
|
|
83
|
+
description: 'Recording action to perform: `start` begins capturing and `stop` finalizes the video file',
|
|
84
|
+
required: true,
|
|
85
|
+
options: ['start', 'stop'],
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
IosRecord.flags = {
|
|
89
|
+
...base_command_1.BaseCommand.baseFlags,
|
|
90
|
+
id: core_1.Flags.string({
|
|
91
|
+
description: 'iOS instance ID to record. Defaults to the last created iOS instance.',
|
|
92
|
+
}),
|
|
93
|
+
quality: core_1.Flags.integer({
|
|
94
|
+
description: 'Recording quality from 5 to 10. Higher values increase quality and file size when starting a recording.',
|
|
95
|
+
default: 5,
|
|
96
|
+
}),
|
|
97
|
+
output: core_1.Flags.string({
|
|
98
|
+
char: 'o',
|
|
99
|
+
description: 'Local file path for the finished recording when using the `stop` action. Defaults to a timestamped mp4 in the current directory.',
|
|
100
|
+
}),
|
|
101
|
+
'presigned-url': core_1.Flags.string({
|
|
102
|
+
description: 'Presigned upload URL to receive the recording when using the `stop` action. Use this if you will upload the recording to a bucket.',
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
exports.default = IosRecord;
|
|
9
106
|
//# sourceMappingURL=record.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/commands/ios/record.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/commands/ios/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { BaseCommand } from '../../base-command';
|
|
2
|
+
export default class IosScreenshot extends BaseCommand {
|
|
3
|
+
static summary: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {};
|
|
7
|
+
static flags: {
|
|
8
|
+
id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
|
+
output: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
2
16
|
//# sourceMappingURL=screenshot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/screenshot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/screenshot.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,OAAO,SAAsD;IACpE,MAAM,CAAC,WAAW,SACmI;IACrJ,MAAM,CAAC,QAAQ,WAIb;IAEF,MAAM,CAAC,IAAI,KAAM;IAEjB,MAAM,CAAC,KAAK;;;;;;MASV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC3B"}
|
|
@@ -3,7 +3,67 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const core_1 = require("@oclif/core");
|
|
9
|
+
const base_command_1 = require("../../base-command");
|
|
10
|
+
const instance_client_factory_1 = require("../../lib/instance-client-factory");
|
|
11
|
+
class IosScreenshot extends base_command_1.BaseCommand {
|
|
12
|
+
async run() {
|
|
13
|
+
const { flags } = await this.parse(IosScreenshot);
|
|
14
|
+
this.setParsedFlags(flags);
|
|
15
|
+
await this.withAuth(async () => {
|
|
16
|
+
const id = this.resolveId(flags.id);
|
|
17
|
+
if ((0, instance_client_factory_1.detectInstanceType)(id) !== 'ios') {
|
|
18
|
+
this.error('ios screenshot only supports iOS instances');
|
|
19
|
+
}
|
|
20
|
+
let screenshot;
|
|
21
|
+
if ((0, instance_client_factory_1.hasActiveSession)(id)) {
|
|
22
|
+
screenshot = await (0, instance_client_factory_1.sendSessionCommand)(id, 'screenshot');
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const { type, client, disconnect } = await (0, instance_client_factory_1.getInstanceClient)(this.client, id);
|
|
26
|
+
try {
|
|
27
|
+
if (type !== 'ios') {
|
|
28
|
+
this.error('ios screenshot only supports iOS instances');
|
|
29
|
+
}
|
|
30
|
+
screenshot = await client.screenshot();
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
disconnect();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (flags.output) {
|
|
37
|
+
const outPath = path_1.default.resolve(flags.output);
|
|
38
|
+
fs_1.default.writeFileSync(outPath, Buffer.from(screenshot.base64, 'base64'));
|
|
39
|
+
this.log(`Screenshot saved to ${outPath}`);
|
|
40
|
+
}
|
|
41
|
+
else if (flags.json) {
|
|
42
|
+
this.outputJson(screenshot);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.log(screenshot.base64);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
IosScreenshot.summary = 'Capture a screenshot from a running iOS instance';
|
|
51
|
+
IosScreenshot.description = 'Capture the current screen from a running iOS instance. Save the image to a file with `-o`, or use `--json` to inspect the raw response payload.';
|
|
52
|
+
IosScreenshot.examples = [
|
|
53
|
+
'<%= config.bin %> ios screenshot -o screenshot.png',
|
|
54
|
+
'<%= config.bin %> ios screenshot --id <instance-ID>',
|
|
55
|
+
'<%= config.bin %> ios screenshot --json',
|
|
56
|
+
];
|
|
57
|
+
IosScreenshot.args = {};
|
|
58
|
+
IosScreenshot.flags = {
|
|
59
|
+
...base_command_1.BaseCommand.baseFlags,
|
|
60
|
+
id: core_1.Flags.string({
|
|
61
|
+
description: 'iOS instance ID to capture. Defaults to the last created iOS instance.',
|
|
62
|
+
}),
|
|
63
|
+
output: core_1.Flags.string({
|
|
64
|
+
char: 'o',
|
|
65
|
+
description: 'File path where the screenshot should be written instead of printing the raw image data',
|
|
66
|
+
}),
|
|
67
|
+
};
|
|
68
|
+
exports.default = IosScreenshot;
|
|
9
69
|
//# sourceMappingURL=screenshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/commands/ios/screenshot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/commands/ios/screenshot.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,sCAAoC;AACpC,qDAAiD;AACjD,+EAK2C;AAE3C,MAAqB,aAAc,SAAQ,0BAAW;IAuBpD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,IAAA,4CAAkB,EAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,UAAe,CAAC;YACpB,IAAI,IAAA,0CAAgB,EAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,UAAU,GAAG,MAAM,IAAA,4CAAkB,EAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,2CAAiB,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC;oBACH,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;wBACnB,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;oBAC3D,CAAC;oBACD,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzC,CAAC;wBAAS,CAAC;oBACT,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACpE,IAAI,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;;AAzDM,qBAAO,GAAG,kDAAkD,CAAC;AAC7D,yBAAW,GAChB,kJAAkJ,CAAC;AAC9I,sBAAQ,GAAG;IAChB,oDAAoD;IACpD,qDAAqD;IACrD,yCAAyC;CAC1C,CAAC;AAEK,kBAAI,GAAG,EAAE,CAAC;AAEV,mBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,wEAAwE;KACtF,CAAC;IACF,MAAM,EAAE,YAAK,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,yFAAyF;KACvG,CAAC;CACH,CAAC;kBArBiB,aAAa"}
|
|
@@ -1,2 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { BaseCommand } from '../../base-command';
|
|
2
|
+
export default class IosScroll extends BaseCommand {
|
|
3
|
+
static summary: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {
|
|
7
|
+
direction: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
|
+
amount: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
2
18
|
//# sourceMappingURL=scroll.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/scroll.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/scroll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAAsC;IACpD,MAAM,CAAC,WAAW,SAC4E;IAC9F,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,IAAI;;MAMT;IAEF,MAAM,CAAC,KAAK;;;;;;MASV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B3B"}
|