@appium/types 0.2.3 → 0.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/lib/driver.ts ADDED
@@ -0,0 +1,601 @@
1
+ import type {EventEmitter} from 'events';
2
+ import {
3
+ HTTPMethod,
4
+ Capabilities,
5
+ AppiumServer,
6
+ UpdateServerCallback,
7
+ Class,
8
+ MethodMap,
9
+ AppiumLogger,
10
+ } from '.';
11
+ import {W3CCapabilities} from './capabilities';
12
+ import {ServerArgs} from './config';
13
+
14
+ export interface TimeoutCommands {
15
+ timeouts(
16
+ type: string,
17
+ ms: number | string,
18
+ script?: number,
19
+ pageLoad?: number,
20
+ implicit?: number | string
21
+ ): Promise<void>;
22
+ setNewCommandTimeout(ms: number): void;
23
+ implicitWait(ms: number | string): Promise<void>;
24
+ setImplicitWait(ms: number): void;
25
+ implicitWaitForCondition(condition: () => Promise<any>): Promise<unknown>;
26
+ getTimeouts(): Promise<Record<string, number>>;
27
+ implicitWaitW3C(ms: number): Promise<void>;
28
+ implicitWaitMJSONWP(ms: number): Promise<void>;
29
+ pageLoadTimeoutW3C(ms: number): Promise<void>;
30
+ pageLoadTimeoutMJSONWP(ms: number): Promise<void>;
31
+ scriptTimeoutW3C(ms: number): Promise<void>;
32
+ scriptTimeoutMJSONWP(ms: number): Promise<void>;
33
+ newCommandTimeout(ms: number): Promise<void>;
34
+ parseTimeoutArgument(ms: number | string): number;
35
+ }
36
+
37
+ export interface EventCommands {
38
+ logCustomEvent(vendor: string, event: string): Promise<void>;
39
+ getLogEvents(type?: string | string[]): Promise<EventHistory | Record<string, number>>;
40
+ }
41
+
42
+ export interface SessionCommands {
43
+ getSessions(): Promise<MultiSessionData[]>;
44
+ getSession(): Promise<SingularSessionData>;
45
+ }
46
+
47
+ export interface MultiSessionData {
48
+ id: string;
49
+ capabilities: Capabilities;
50
+ }
51
+
52
+ export type SingularSessionData = Capabilities & {events?: EventHistory};
53
+
54
+ export interface FindCommands {
55
+ findElement(strategy: string, selector: string): Promise<Element>;
56
+ findElements(strategy: string, selector: string): Promise<Element[]>;
57
+ findElementFromElement(strategy: string, selector: string, elementId: string): Promise<Element>;
58
+ findElementsFromElement(
59
+ strategy: string,
60
+ selector: string,
61
+ elementId: string
62
+ ): Promise<Element[]>;
63
+
64
+ findElOrEls<Mult extends boolean>(
65
+ strategy: string,
66
+ selector: string,
67
+ mult: Mult,
68
+ context?: string
69
+ ): Promise<Mult extends true ? Element[] : Element>;
70
+
71
+ findElOrElsWithProcessing<Mult extends boolean>(
72
+ strategy: string,
73
+ selector: string,
74
+ mult: Mult,
75
+ context?: string
76
+ ): Promise<Mult extends true ? Element[] : Element>;
77
+
78
+ getPageSource(): Promise<string>;
79
+ }
80
+
81
+ export interface LogCommands {
82
+ supportedLogTypes: Record<string, LogType<Driver>>;
83
+ getLogTypes(): Promise<string[]>;
84
+ /**
85
+ * Gets logs
86
+ *
87
+ * TODO: `logType` should be a key in `supportedLogTypes`, and the return value of this function
88
+ * should be the associated `LogType` object's `LogEntry` parameterized type.
89
+ * @param logType - Name/key of log type as defined in {@linkcode LogCommands.supportedLogTypes}.
90
+ */
91
+ getLog(logType: string): Promise<any[]>;
92
+ }
93
+
94
+ export interface SettingsCommands {
95
+ updateSettings: (settings: Record<string, any>) => Promise<void>;
96
+ getSettings(): Promise<Record<string, any>>;
97
+ }
98
+
99
+ export interface SessionHandler<CreateResult, DeleteResult> {
100
+ createSession(
101
+ w3cCaps1: W3CCapabilities,
102
+ w3cCaps2?: W3CCapabilities,
103
+ w3cCaps?: W3CCapabilities,
104
+ driverData?: DriverData[]
105
+ ): Promise<CreateResult>;
106
+
107
+ deleteSession(sessionId?: string, driverData?: DriverData[]): Promise<DeleteResult>;
108
+ }
109
+
110
+ /**
111
+ * Custom session data for a driver.
112
+ */
113
+ export type DriverData = Record<string, unknown>;
114
+
115
+ /**
116
+ * Extensions can define new methods for the Appium server to map to command names, of the same
117
+ * format as used in Appium's `routes.js`.
118
+ *
119
+ *
120
+ * @example
121
+ * {
122
+ * '/session/:sessionId/new_method': {
123
+ * GET: {command: 'getNewThing'},
124
+ * POST: {command: 'setNewThing', payloadParams: {required: ['someParam']}}
125
+ * }
126
+ * }
127
+ */
128
+ export interface Constraint {
129
+ presence?: boolean | {allowEmpty: boolean};
130
+ isString?: boolean;
131
+ isNumber?: boolean;
132
+ isBoolean?: boolean;
133
+ isObject?: boolean;
134
+ isArray?: boolean;
135
+ deprecated?: boolean;
136
+ inclusion?: any[];
137
+ }
138
+ export type Constraints = Record<string, Constraint>;
139
+
140
+ export interface Element {
141
+ 'element-6066-11e4-a52e-4f735466cecf': string;
142
+ }
143
+
144
+ export interface DriverHelpers {
145
+ configureApp: (app: string, supportedAppExtensions: string[]) => Promise<string>;
146
+ isPackageOrBundle: (app: string) => boolean;
147
+ duplicateKeys: <T>(input: T, firstKey: string, secondKey: string) => T;
148
+ parseCapsArray: (cap: string | string[]) => string[];
149
+ generateDriverLogPrefix: (obj: Core, sessionId?: string) => string;
150
+ }
151
+
152
+ export type SettingsUpdateListener<T extends Record<string, unknown> = Record<string, unknown>> = (
153
+ prop: keyof T,
154
+ newValue: unknown,
155
+ curValue: unknown
156
+ ) => Promise<void>;
157
+
158
+ export interface DeviceSettings<T = any> {
159
+ update(newSettings: Record<string, T>): Promise<void>;
160
+ getSettings(): Record<string, T>;
161
+ }
162
+
163
+ export interface LogType<TDriver, LogEntry = string> {
164
+ description: string;
165
+ getter: (driver: TDriver) => Promise<LogEntry[]>;
166
+ }
167
+
168
+ // WebDriver
169
+
170
+ export interface Rect {
171
+ x: number;
172
+ y: number;
173
+ width: number;
174
+ height: number;
175
+ }
176
+
177
+ export type NewWindowType = 'tab' | 'window';
178
+
179
+ export interface NewWindow {
180
+ handle: string;
181
+ type: NewWindowType;
182
+ }
183
+
184
+ export interface Cookie {
185
+ name: string;
186
+ value: string;
187
+ path?: string;
188
+ domain?: string;
189
+ secure?: boolean;
190
+ httpOnly?: boolean;
191
+ expiry?: number;
192
+ sameSite?: 'Lax' | 'Strict';
193
+ }
194
+
195
+ export interface Actions {
196
+ type?: string;
197
+ actions: Action[];
198
+ parameters?: {
199
+ pointerType?: string;
200
+ };
201
+ }
202
+
203
+ export interface Action {
204
+ duration?: number;
205
+ type: string;
206
+ value?: string;
207
+ x?: number;
208
+ y?: number;
209
+ button?: number;
210
+ origin?: string;
211
+ }
212
+
213
+ // Appium W3C WebDriver Extension
214
+
215
+ export interface ScreenRecordOptions {
216
+ remotePath?: string;
217
+ username?: string;
218
+ password?: string;
219
+ method?: string;
220
+ forceRestart?: boolean;
221
+ timeLimit?: string;
222
+ videoType?: string;
223
+ videoQuality?: string;
224
+ videoFps?: string;
225
+ videoScale?: string;
226
+ bitRate?: string;
227
+ videoSize?: string;
228
+ bugReport?: string;
229
+ }
230
+
231
+ // JSONWP
232
+
233
+ export type Size = Pick<Rect, 'width' | 'height'>;
234
+
235
+ export type Position = Pick<Rect, 'x' | 'y'>;
236
+
237
+ export interface Location {
238
+ latitude: number;
239
+ longitude: number;
240
+ altitude: number;
241
+ }
242
+
243
+ export interface Rotation {
244
+ x: number;
245
+ y: number;
246
+ z: number;
247
+ }
248
+
249
+ // Web Authentication
250
+
251
+ export interface Credential {
252
+ credentialId: string;
253
+ isResidentCredential: boolean;
254
+ rpId: string;
255
+ privateKey: string;
256
+ userHandle?: string;
257
+ signCount: number;
258
+ largeBlob?: string;
259
+ }
260
+
261
+ export interface EventHistory {
262
+ commands: EventHistoryCommand[];
263
+ [key: string]: any;
264
+ }
265
+
266
+ export interface EventHistoryCommand {
267
+ cmd: string;
268
+ startTime: number;
269
+ endTime: number;
270
+ }
271
+
272
+ /**
273
+ * Methods and properties which both `AppiumDriver` and `BaseDriver` inherit.
274
+ *
275
+ * This should not be used directly by external code.
276
+ */
277
+ export interface Core {
278
+ shouldValidateCaps: boolean;
279
+ sessionId: string | null;
280
+ opts: DriverOpts;
281
+ initialOpts: ServerArgs;
282
+ caps?: Capabilities;
283
+ originalCaps?: W3CCapabilities;
284
+ protocol?: string;
285
+ helpers: DriverHelpers;
286
+ basePath: string;
287
+ relaxedSecurityEnabled: boolean;
288
+ allowInsecure: string[];
289
+ denyInsecure: string[];
290
+ newCommandTimeoutMs: number;
291
+ implicitWaitMs: number;
292
+ locatorStrategies: string[];
293
+ webLocatorStrategies: string[];
294
+ eventEmitter: EventEmitter;
295
+ settings: DeviceSettings;
296
+ log: AppiumLogger;
297
+ driverData?: DriverData;
298
+ isCommandsQueueEnabled: boolean;
299
+ eventHistory: EventHistory;
300
+ onUnexpectedShutdown(handler: () => any): void;
301
+ getStatus(): Promise<any>;
302
+ sessionExists(sessionId: string): boolean;
303
+ isW3CProtocol(): boolean;
304
+ isMjsonwpProtocol(): boolean;
305
+ isFeatureEnabled(name: string): boolean;
306
+ assertFeatureEnabled(name: string): void;
307
+ validateLocatorStrategy(strategy: string, webContext?: boolean): void;
308
+ proxyActive(sessionId?: string): boolean;
309
+ getProxyAvoidList(sessionId?: string): [string, RegExp][];
310
+ canProxy(sessionId?: string): boolean;
311
+ proxyRouteIsAvoided(sessionId: string, method: string, url: string): boolean;
312
+ addManagedDriver(driver: Driver): void;
313
+ getManagedDrivers(): Driver[];
314
+ clearNewCommandTimeout(): Promise<void>;
315
+ logEvent(eventName: string): void;
316
+ driverForSession(sessionId: string): Core | null;
317
+ }
318
+
319
+ /**
320
+ * `BaseDriver` implements this. It contains default behavior;
321
+ * external drivers are expected to implement {@linkcode ExternalDriver} instead.
322
+ */
323
+ export interface Driver
324
+ extends SessionCommands,
325
+ LogCommands,
326
+ FindCommands,
327
+ SettingsCommands,
328
+ TimeoutCommands,
329
+ EventCommands,
330
+ SessionHandler<[string, any], void>,
331
+ Core {
332
+ cliArgs?: Record<string, any>;
333
+ // The following methods are implemented by `BaseDriver`.
334
+ executeCommand(cmd: string, ...args: any[]): Promise<any>;
335
+ startUnexpectedShutdown(err?: Error): Promise<void>;
336
+ startNewCommandTimeout(): Promise<void>;
337
+ reset(): Promise<void>;
338
+ desiredCapConstraints: Constraints;
339
+ validateDesiredCaps(caps: Capabilities): boolean;
340
+ logExtraCaps(caps: Capabilities): void;
341
+ assignServer?(server: AppiumServer, host: string, port: number, path: string): void;
342
+ }
343
+
344
+ /**
345
+ * External drivers must subclass `BaseDriver`, and can implement any of these methods.
346
+ * None of these are implemented within Appium itself.
347
+ */
348
+ export interface ExternalDriver extends Driver {
349
+ // The following properties are assigned by appium */
350
+ server: AppiumServer;
351
+ serverHost: string;
352
+ serverPort: number;
353
+ serverPath: string;
354
+
355
+ // WebDriver
356
+ setUrl?(url: string): Promise<void>;
357
+ getUrl?(): Promise<string>;
358
+ back?(): Promise<void>;
359
+ forward?(): Promise<void>;
360
+ refresh?(): Promise<void>;
361
+ title?(): Promise<string>;
362
+ getWindowHandle?(): Promise<string>;
363
+ closeWindow?(): Promise<string[]>;
364
+ setWindow?(handle: string): Promise<void>;
365
+ getWindowHandles?(): Promise<string[]>;
366
+ setFrame?(id: null | number | string): Promise<void>;
367
+ getWindowRect?(): Promise<Rect>;
368
+ setWindowRect?(x: number, y: number, width: number, height: number): Promise<Rect>;
369
+ maximizeWindow?(): Promise<Rect>;
370
+ minimizeWindow?(): Promise<Rect>;
371
+ fullScreenWindow?(): Promise<Rect>;
372
+ createNewWindow?(type?: NewWindowType): Promise<NewWindow>;
373
+ active?(): Promise<Element>;
374
+ elementSelected?(elementId: string): Promise<boolean>;
375
+ getAttribute?(name: string, elementId: string): Promise<string | null>;
376
+ getProperty?(name: string, elementId: string): Promise<string | null>;
377
+ getCssProperty?(name: string, elementId: string): Promise<string>;
378
+ getText?(elementId: string): Promise<string>;
379
+ getName?(elementId: string): Promise<string>;
380
+ getElementRect?(elementId: string): Promise<Rect>;
381
+ elementEnabled?(elementId: string): Promise<boolean>;
382
+ elementDisplayed?(elementId: string): Promise<boolean>;
383
+ click?(elementId: string): Promise<void>;
384
+ clear?(elementId: string): Promise<void>;
385
+ setValue?(text: string, elementId: string): Promise<void>;
386
+ execute?(script: string, args: unknown[]): Promise<unknown>;
387
+ executeAsync?(script: string, args: unknown[]): Promise<unknown>;
388
+ getCookies?(): Promise<Cookie[]>;
389
+ getCookie?(name: string): Promise<Cookie>;
390
+ setCookie?(cookie: Cookie): Promise<void>;
391
+ deleteCookie?(name: string): Promise<void>;
392
+ deleteCookies?(): Promise<void>;
393
+ performActions?(actions: Actions[]): Promise<void>;
394
+ releaseActions?(): Promise<void>;
395
+ postDismissAlert?(): Promise<void>;
396
+ postAcceptAlert?(): Promise<void>;
397
+ getAlertText?(): Promise<string | null>;
398
+ setAlertText?(text: string): Promise<void>;
399
+ getScreenshot?(): Promise<string>;
400
+ getElementScreenshot?(elementId: string): Promise<string>;
401
+
402
+ // Appium W3C WebDriver Extension
403
+ mobileShake?(): Promise<void>;
404
+ getDeviceTime?(format?: string): Promise<string>;
405
+ lock?(seconds?: number): Promise<void>;
406
+ unlock?(): Promise<void>;
407
+ isLocked?(): Promise<boolean>;
408
+ startRecordingScreen?(options?: ScreenRecordOptions): Promise<void>;
409
+ stopRecordingScreen?(options?: ScreenRecordOptions): Promise<string>;
410
+ getPerformanceDataTypes?(): Promise<string[]>;
411
+ getPerformanceData?(
412
+ packageName: string,
413
+ dataType: string,
414
+ dataReadTimeout?: number
415
+ ): Promise<string[]>;
416
+ pressKeyCode?(keycode: number, metastate?: number, flags?: number): Promise<void>;
417
+ longPressKeyCode?(keycode: number, metastate?: number, flags?: number): Promise<void>;
418
+ fingerprint?(fingerprintId: number): Promise<void>;
419
+ sendSMS?(phoneNumber: string, message: string): Promise<void>;
420
+ gsmCall?(phoneNumber: string, action: string): Promise<void>;
421
+ gsmSignal?(signalStrength: string): Promise<void>;
422
+ gsmVoice?(state: string): Promise<void>;
423
+ powerCapacity?(percent: number): Promise<void>;
424
+ powerAC?(state: string): Promise<void>;
425
+ networkSpeed?(netspeed: string): Promise<void>;
426
+ keyevent?(keycode: string, metastate?: string): Promise<void>;
427
+ mobileRotation?(
428
+ x: number,
429
+ y: number,
430
+ radius: number,
431
+ rotation: number,
432
+ touchCount: number,
433
+ duration: string,
434
+ elementId?: string
435
+ ): Promise<void>;
436
+ getCurrentActivity?(): Promise<string>;
437
+ getCurrentPackage?(): Promise<string>;
438
+ installApp?(appPath: string, options?: unknown): Promise<void>;
439
+ activateApp?(appId: string, options?: unknown): Promise<void>;
440
+ removeApp?(appId: string, options?: unknown): Promise<void>;
441
+ terminateApp?(appId: string, options?: unknown): Promise<void>;
442
+ isAppInstalled?(appId: string): Promise<boolean>;
443
+ queryAppState?(appId: string): Promise<number>;
444
+ hideKeyboard?(strategy?: string, key?: string, keyCode?: string, keyName?: string): Promise<void>;
445
+ isKeyboardShown?(): Promise<boolean>;
446
+ pushFile?(path: string, data: string): Promise<void>;
447
+ pullFile?(path: string): Promise<string>;
448
+ pullFolder?(path: string): Promise<string>;
449
+ toggleFlightMode?(): Promise<void>;
450
+ toggleData?(): Promise<void>;
451
+ toggleWiFi?(): Promise<void>;
452
+ toggleLocationServices?(): Promise<void>;
453
+ openNotifications?(): Promise<void>;
454
+ startActivity?(
455
+ appPackage: string,
456
+ appActivity: string,
457
+ appWaitPackage?: string,
458
+ appWaitActivity?: string,
459
+ intentAction?: string,
460
+ intentCategory?: string,
461
+ intentFlags?: string,
462
+ optionalIntentArguments?: string,
463
+ dontStopAppOnReset?: boolean
464
+ ): Promise<void>;
465
+ getSystemBars?(): Promise<unknown[]>;
466
+ getDisplayDensity?(): Promise<number>;
467
+ touchId?(match: boolean): Promise<void>;
468
+ toggleEnrollTouchId?(enabled: boolean): Promise<void>;
469
+ launchApp?(): Promise<void>;
470
+ closeApp?(): Promise<void>;
471
+ background?(seconds: null | number): Promise<void>;
472
+ endCoverage?(intent: string, path: string): Promise<void>;
473
+ getStrings?(language?: string, stringFile?: string): Promise<Record<string, unknown>>;
474
+ setValueImmediate?(value: string, elementId: string): Promise<void>;
475
+ replaceValue?(value: string, elementId: string): Promise<void>;
476
+ receiveAsyncResponse?(response: unknown): Promise<void>;
477
+ setClipboard?(content: string, contentType?: string, label?: string): Promise<void>;
478
+ getClipboard?(contentType?: string): Promise<string>;
479
+
480
+ // JSONWP
481
+ asyncScriptTimeout?(ms: number): Promise<void>;
482
+ getWindowSize?(): Promise<Size>;
483
+ getLocation?(elementId: string): Promise<Position>;
484
+ getLocationInView?(elementId: string): Promise<Position>;
485
+ getSize?(elementId: string): Promise<Size>;
486
+ elementShadowRoot?(elementId: string): Promise<Element>;
487
+ findElementFromShadowRoot?(
488
+ strategy: string,
489
+ selector: string,
490
+ shadowId: string
491
+ ): Promise<Element>;
492
+ findElementsFromShadowRoot?(
493
+ strategy: string,
494
+ selector: string,
495
+ shadowId: string
496
+ ): Promise<Element[]>;
497
+ equalsElement?(elementId: string, otherElementId: string): Promise<boolean>;
498
+ submit?(elementId: string): Promise<void>;
499
+ keys?(value: string[]): Promise<void>;
500
+ availableIMEEngines?(): Promise<string[]>;
501
+ getActiveIMEEngine?(): Promise<string>;
502
+ isIMEActivated?(): Promise<boolean>;
503
+ deactivateIMEEngine?(): Promise<void>;
504
+ activateIMEEngine?(engine: string): Promise<void>;
505
+ getOrientation?(): Promise<string>;
506
+ setOrientation?(orientation: string): Promise<void>;
507
+ moveTo?(element?: null | string, xOffset?: number, yOffset?: number): Promise<void>;
508
+ buttonDown?(button?: number): Promise<void>;
509
+ buttonUp?(button?: number): Promise<void>;
510
+ clickCurrent?(button?: number): Promise<void>;
511
+ doubleClick?(): Promise<void>;
512
+ touchDown?(x: number, y: number): Promise<void>;
513
+ touchUp?(x: number, y: number): Promise<void>;
514
+ touchMove?(x: number, y: number): Promise<void>;
515
+ touchLongClick?(elementId: string): Promise<void>;
516
+ flick?(
517
+ element?: string,
518
+ xSpeed?: number,
519
+ ySpeed?: number,
520
+ xOffset?: number,
521
+ yOffset?: number,
522
+ speed?: number
523
+ ): Promise<void>;
524
+ getGeoLocation?(): Promise<Location>;
525
+ setGeoLocation?(location: Partial<Location>): Promise<void>;
526
+
527
+ // MJSONWIRE
528
+ getCurrentContext?(): Promise<string | null>;
529
+ setContext?(name: string): Promise<void>;
530
+ getContexts?(): Promise<string[]>;
531
+ getPageIndex?(elementId: string): Promise<string>;
532
+ getNetworkConnection?(): Promise<number>;
533
+ setNetworkConnection?(type: number): Promise<void>;
534
+ performTouch?(actions: unknown): Promise<void>;
535
+ performMultiAction?(actions: unknown, elementId: string): Promise<void>;
536
+ getRotation?(): Promise<Rotation>;
537
+ setRotation?(x: number, y: number, z: number): Promise<void>;
538
+
539
+ // Chromium DevTools
540
+ executeCdp?(cmd: string, params: unknown): Promise<unknown>;
541
+
542
+ // Web Authentication
543
+ addVirtualAuthenticator?(
544
+ protocol: string,
545
+ transport: string,
546
+ hasResidentKey?: boolean,
547
+ hasUserVerification?: boolean,
548
+ isUserConsenting?: boolean,
549
+ isUserVerified?: boolean
550
+ ): Promise<void>;
551
+ removeVirtualAuthenticator?(): Promise<void>;
552
+ addAuthCredential?(
553
+ credentialId: string,
554
+ isResidentCredential: boolean,
555
+ rpId: string,
556
+ privateKey: string,
557
+ userHandle?: string,
558
+ signCount?: number
559
+ ): Promise<void>;
560
+ getAuthCredential?(): Promise<Credential[]>;
561
+ removeAllAuthCredentials?(): Promise<void>;
562
+ removeAuthCredential?(): Promise<void>;
563
+ setUserAuthVerified?(isUserVerified: boolean): Promise<void>;
564
+
565
+ proxyCommand?(url: string, method: HTTPMethod, body?: string): Promise<unknown>;
566
+ }
567
+
568
+ /**
569
+ * Static members of a {@linkcode DriverClass}.
570
+ *
571
+ * This is likely unusable by external consumers, but YMMV!
572
+ */
573
+ export interface DriverStatic {
574
+ baseVersion: string;
575
+ updateServer?: UpdateServerCallback;
576
+ newMethodMap?: MethodMap<ExternalDriver>;
577
+ }
578
+
579
+ /**
580
+ * Represents a driver class, which is used internally by Appium.
581
+ *
582
+ * This is likely unusable by external consumers, but YMMV!
583
+ */
584
+ export type DriverClass<
585
+ D extends Driver = ExternalDriver,
586
+ S extends DriverStatic = DriverStatic
587
+ > = Class<D, S, [] | [Partial<ServerArgs>] | [Partial<ServerArgs>, boolean]>;
588
+
589
+ /**
590
+ * Options as passed into a driver constructor, which is just a union of {@linkcode ServerArgs} and {@linkcode Capabilities}.
591
+ *
592
+ * The combination happens within Appium prior to calling the constructor.
593
+ */
594
+ export type DriverOpts = ServerArgs & Capabilities;
595
+
596
+ export type DriverCommand<TArgs = any, TReturn = unknown> = (...args: TArgs[]) => Promise<TReturn>;
597
+
598
+ export type DriverCommands<TArgs = any, TReturn = unknown> = Record<
599
+ string,
600
+ DriverCommand<TArgs, TReturn>
601
+ >;