@appium/types
Version:
Various type declarations used across Appium
170 lines (151 loc) • 5.51 kB
text/typescript
import {BaseDriverCapConstraints} from './constraints';
import {Constraint, Constraints} from './driver';
import {StandardCapabilities} from './standard-caps';
import {AnyCase, StringRecord} from './util';
export {StandardCapabilities};
export type W3C_APPIUM_PREFIX = 'appium';
/**
* Base capabilities as derived from {@linkcode BaseDriverCapConstraints}.
*/
export type BaseCapabilities = Capabilities<BaseDriverCapConstraints>;
/**
* Like {@linkcode BaseCapabilities}, except all Appium-specific keys are namespaced.
*/
export type BaseNSCapabilities = NSCapabilities<BaseDriverCapConstraints>;
/**
* Like {@linkcode NSBaseCapabilities}, except W3C-style.
* @see {@linkcode W3CCapabilities}
*/
export type BaseW3CCapabilities = W3CCapabilities<BaseDriverCapConstraints>;
/**
* Given a {@linkcode Constraint} `C` and a type `T`, see if `inclusion`/`inclusionCaseInsensitive` is present, and create a union of its allowed literals; otherwise just use `T`.
*/
export type ConstraintChoice<C extends Constraint, T> = C['inclusionCaseInsensitive'] extends T[]
? AnyCase<C['inclusionCaseInsensitive'][number]>
: C['inclusion'] extends ReadonlyArray<T>
? C['inclusion'][number]
: T;
/**
* Given {@linkcode Constraint} `C`, determine the associated type of the capability.
*
* Notes:
*
* - Only `number` and `string` values can have "choices" (`inclusion`/`inclusionCaseInesnsitive`) associated with them.
* - If `isArray` is `true`, the type is always of type `string[]`. If this is incorrect, then it will be `any[]`.
* - There is no way to express the shape of an object if `ifObject` is `true`.
*/
export type ConstraintToCapKind<C extends Constraint> = C['isString'] extends true
? ConstraintChoice<C, string>
: C['isNumber'] extends true
? ConstraintChoice<C, number>
: C['isBoolean'] extends true
? boolean
: C['isArray'] extends true
? string[]
: C['isObject'] extends true
? StringRecord
: unknown;
/**
* Given {@linkcode Constraint} `C`, determine if it is required or optional.
*
* In practice, _all_ capabilities are considered optional per types, but various errors might be thrown if some are not present.
*/
export type ConstraintToCap<C extends Constraint> = C['presence'] extends
| true
| {allowEmpty: boolean}
? ConstraintToCapKind<C>
: ConstraintToCapKind<C> | undefined;
/**
* Given {@linkcode StringRecord} `T` and namespace string `NS`, a type with the key names prefixed by `${NS}:` _except_ for standard capabilities. `NS` defaults to `appium`.
*
* If `T` is already namespaced, well, it'll get _double_-namespaced.
*/
export type CapsToNSCaps<T extends StringRecord, NS extends string = W3C_APPIUM_PREFIX> = {
[K in keyof T as K extends keyof StandardCapabilities
? K
: NamespacedString<K & string, NS>]: T[K];
};
/**
* A namespaced string of the format `<NS>:<S>` where `NS` defaults to the value of
* {@linkcode W3C_APPIUM_PREFIX} and `S` is a string.
*/
export type NamespacedString<
S extends string,
NS extends string = W3C_APPIUM_PREFIX
> = `${NS}:${S}`;
/**
* Converts {@linkcode Constraint} `C` to a {@linkcode Capabilities} object.
* @privateRemarks I would like to figure out how to simplify this type
*/
export type ConstraintsToCaps<C extends Constraints> = {
-readonly [K in keyof C]: ConstraintToCap<C[K]>;
};
/**
* Given some constraints, return the entire set of supported capabilities it supports (including whatever is in its desired caps).
*
* Does not contain {@linkcode BaseCapabilities}; see {@linkcode DriverCaps}.
*/
export type Capabilities<C extends Constraints> = ConstraintsToCaps<C>;
/**
* Like {@linkcode Capabilities}, except W3C-style.
*
* Does not contain {@linkcode BaseCapabilities}; see {@linkcode W3CDriverCaps}.
*/
export interface W3CCapabilities<C extends Constraints> {
alwaysMatch: NSCapabilities<C>;
firstMatch: NSCapabilities<C>[];
}
/**
* Namespaced caps (where appropriate).
*
* Does not contain {@linkcode BaseCapabilities}; see {@linkcode NSDriverCaps}.
*/
export type NSCapabilities<C extends Constraints, NS extends string = W3C_APPIUM_PREFIX> = Partial<
CapsToNSCaps<ConstraintsToCaps<C>, NS>
>;
/**
* Capabilities for drivers extending `BaseDriver`.
*
* Includes {@linkcode BaseCapabilities}.
*
* @example
* ```ts
* class MyDriver extends BaseDriver<MyDriverConstraints> {
* async createSession (w3ccaps: W3CDriverCaps<MyDriverConstraints>, ...args: any[]) {
* const [
* sessionId: string,
* caps: DriverCaps<MyDriverConstraints>
* ] = await super.createSession(w3ccaps, ...args);
* // ...
* }
* }
* ```
*/
/**
* Normalized capabilities for drivers extending `BaseDriver`.
* Includes {@linkcode BaseCapabilities}.
*/
export type DriverCaps<C extends Constraints = Constraints> = BaseCapabilities & Capabilities<C>;
/**
* W3C-style capabilities for drivers extending `BaseDriver`.
*
* Includes {@linkcode BaseW3CCapabilities}.
*
* @example
* ```ts
* class MyDriver extends BaseDriver<MyDriverConstraints> {
* async createSession (w3ccaps: W3CDriverCaps<MyDriverConstraints>, ...args: any[]) {
* // ...
* }
* }
* ```
*/
export type W3CDriverCaps<C extends Constraints = Constraints> = BaseW3CCapabilities &
W3CCapabilities<C>;
/**
* Namespaced capabilities for drivers extending `BaseDriver`.
*
* Includes {@linkcode BaseNSCapabilities}.
*/
export type NSDriverCaps<C extends Constraints = Constraints> = BaseNSCapabilities &
NSCapabilities<C>;