appium
Version:
Automation for Apps.
265 lines • 9.87 kB
TypeScript
/**
* Key/value pairs go in... but they don't come out.
*
* @template K,V
* @extends {Map<K,V>}
*/
export class RoachHotelMap<K, V> extends Map<K, V> {
constructor();
constructor(entries?: readonly (readonly [K, V])[] | null | undefined);
constructor();
constructor(iterable?: Iterable<readonly [K, V]> | null | undefined);
/**
* @param {K} key
* @param {V} value
*/
set(key: K, value: V): this;
}
/**
* Extensions that an extension schema file can have.
*/
export const ALLOWED_SCHEMA_EXTENSIONS: Readonly<Set<AllowedSchemaExtension>>;
/**
* Thrown when the {@link AppiumSchema} instance has not yet been finalized, but
* the method called requires it.
*/
export class SchemaFinalizationError extends Error {
constructor();
/**
* @type {Readonly<string>}
*/
code: Readonly<string>;
}
/**
* Thrown when a "unique" schema ID conflicts with an existing schema ID.
*
* This is likely going to be caused by attempting to register the same schema twice.
*/
export class SchemaNameConflictError extends Error {
/**
* @param {ExtensionType} extType
* @param {string} extName
*/
constructor(extType: ExtensionType, extName: string);
/**
* @type {Readonly<string>}
*/
code: Readonly<string>;
/**
* @type {Readonly<{extType: ExtensionType, extName: string}>}
*/
data: Readonly<{
extType: ExtensionType;
extName: string;
}>;
}
/**
* Thrown when a schema ID was expected, but it doesn't exist on the {@link Ajv} instance.
*/
export class SchemaUnknownSchemaError extends ReferenceError {
/**
* @param {string} schemaId
*/
constructor(schemaId: string);
/**
* @type {Readonly<string>}
*/
code: Readonly<string>;
/**
* @type {Readonly<{schemaId: string}>}
*/
data: Readonly<{
schemaId: string;
}>;
}
/**
* Thrown when a schema is provided, but it's of an unsupported type.
*
* "Valid" schemas which are unsupported include boolean schemas and async schemas
* (having a `true` `$async` property).
*/
export class SchemaUnsupportedSchemaError extends TypeError {
/**
* @param {any} schema
* @param {ExtensionType} extType
* @param {string} extName
*/
constructor(schema: any, extType: ExtensionType, extName: string);
/**
* @type {Readonly<string>}
*/
code: Readonly<string>;
/**
* @type {Readonly<{schema: any, extType: ExtensionType, extName: string}>}
*/
data: Readonly<{
schema: any;
extType: ExtensionType;
extName: string;
}>;
}
/**
* Registers a schema from an extension.
*
* This is "fail-fast" in that the schema will immediately be validated against JSON schema draft-07 _or_ whatever the value of the schema's `$schema` prop is.
*
* Does _not_ add the schema to the `ajv` instance (this is done by {@link AppiumSchema.finalize}).
* @param {ExtensionType} extType - Extension type
* @param {string} extName - Unique extension name for `type`
* @param {SchemaObject} schema - Schema object
* @throws {SchemaNameConflictError} If the schema is an invalid
* @returns {void}
*/
export function registerSchema(extType: ExtensionType, extName: string, schema: SchemaObject): void;
export function getAllArgSpecs(): RoachHotelMap<string, ArgSpec<any>>;
/**
* Returns a {@link ArgSpec} for the given argument name.
* @param {string} name - CLI argument name
* @param {ExtensionType} [extType] - Extension type
* @param {string} [extName] - Extension name
* @returns {ArgSpec|undefined} ArgSpec or `undefined` if not found
*/
export function getArgSpec(name: string, extType?: ExtensionType, extName?: string): ArgSpec<any> | undefined;
/**
* Returns `true` if the instance knows about an argument by the given `name`.
* @param {string} name - CLI argument name
* @param {ExtensionType} [extType] - Extension type
* @param {string} [extName] - Extension name
* @returns {boolean} `true` if such an {@link ArgSpec} exists
*/
export function hasArgSpec(name: string, extType?: ExtensionType, extName?: string): boolean;
/**
* Return `true` if {@link AppiumSchema.finalize finalize} has been called
* successfully and {@link AppiumSchema.reset reset} has not been called since.
* @returns {boolean} If finalized
*/
export function isFinalized(): boolean;
/**
* Call this when no more schemas will be registered.
*
* This does three things:
* 1. It combines all schemas from extensions into the Appium config schema,
* then adds the result to the `Ajv` instance.
* 2. It adds schemas for _each_ argument/property for validation purposes.
* The CLI uses these schemas to validate specific arguments.
* 3. The schemas are validated against JSON schema draft-07 (which is the
* only one supported at this time)
*
* Any method in this instance that needs to interact with the `Ajv` instance
* will throw if this method has not been called.
*
* If the instance has already been finalized, this is a no-op.
* @public
* @throws {Error} If the schema is not valid
* @returns {Readonly<Record<string,StrictSchemaObject>>} Record of schema IDs to full schema objects
*/
export function finalizeSchema(): Readonly<Record<string, StrictSchemaObject>>;
/**
* Resets this instance to its original state.
*
* - Removes all added schemas from the `Ajv` instance
* - Resets the map of {@link ArgSpec ArgSpecs}
* - Resets the map of registered schemas
* - Sets the {@link AppiumSchema._finalized _finalized} flag to `false`
*
* If you need to call {@link AppiumSchema.finalize} again, you'll want to call this first.
* @returns {void}
*/
export function resetSchema(): void;
/**
* Given an object, validates it against the Appium config schema.
* If errors occur, the returned array will be non-empty.
* @param {any} value - The value (hopefully an object) to validate against the schema
* @param {string} [ref] - Schema ID or ref.
* @public
* @returns {import('ajv').ErrorObject[]} Array of errors, if any.
*/
export function validate(value: any, ref?: string): import("ajv").ErrorObject[];
/**
* Retrieves the schema itself
* @public
* @param {string} [ref] - Schema ID
* @throws If the schema has not yet been finalized
* @returns {SchemaObject}
*/
export function getSchema(ref?: string): SchemaObject;
/**
* Flatten schema into an array of `SchemaObject`s and associated
* {@link ArgSpec ArgSpecs}.
*
* Converts nested extension schemas to keys based on the extension type and
* name. Used when translating to `argparse` options or getting the list of
* default values (see {@link AppiumSchema.getDefaults}) for CLI or otherwise.
*
* The return value is an intermediate representation used by `cli-args`
* module's `toParserArgs`, which converts the finalized schema to parameters
* used by `argparse`.
* @throws If {@link AppiumSchema.finalize} has not been called yet.
* @returns {FlattenedSchema}
*/
export function flattenSchema(): FlattenedSchema;
/**
* Returns a `Record` of argument "dest" strings to default values.
*
* The "dest" string is the property name in object returned by
* `argparse.ArgumentParser['parse_args']`.
* @template {boolean|undefined} Flattened
* @param {Flattened} [flatten=true] - If `true`, flattens the returned object
* using "keypath"-style keys of the format `<extType>.<extName>.<argName>`.
* Otherwise, returns a nested object using `extType` and `extName` as
* properties. Base arguments (server arguments) are always at the top level.
* @returns {DefaultValues<Flattened>}
*/
export function getDefaultsForSchema<Flattened extends boolean | undefined>(flatten?: Flattened | undefined): DefaultValues<Flattened>;
/**
* Returns a flattened Record of defaults for a specific extension. Keys will
* be of format `<argName>`.
* @param {ExtensionType} extType - Extension type
* @param {string} extName - Extension name
* @returns {Record<string,ArgSpecDefaultValue>}
*/
export function getDefaultsForExtension(extType: ExtensionType, extName: string): Record<string, ArgSpecDefaultValue>;
/**
* Returns `true` if `filename`'s file extension is allowed (in {@link ALLOWED_SCHEMA_EXTENSIONS}).
* @param {import('type-fest').LiteralUnion<AllowedSchemaExtension, string>} filename
* @returns {boolean}
*/
export function isAllowedSchemaFileExtension(filename: import("type-fest").LiteralUnion<AllowedSchemaExtension, string>): boolean;
/**
* Appium only supports schemas that are plain objects; not arrays.
*/
export type SchemaObject = import("ajv").SchemaObject & {
[key: number]: never;
};
export type ExtensionType = import("@appium/types").ExtensionType;
/**
* An object having property `additionalProperties: false`
*/
export type StrictProp = {
additionalProperties: false;
};
/**
* A {@link SchemaObject} with `additionalProperties: false`
*/
export type StrictSchemaObject = SchemaObject & StrictProp;
/**
* A list of schemas associated with properties and their corresponding {@link ArgSpec} objects.
*
* Intermediate data structure used when converting the entire schema down to CLI arguments.
*/
export type FlattenedSchema = {
schema: SchemaObject;
argSpec: ArgSpec<any>;
}[];
export type ArgSpecDefaultValue = any;
/**
* e.g. `{driver: {foo: 'bar'}}` where `foo` is the arg name and `bar` is the default value.
*/
export type NestedArgSpecDefaultValue = Record<string, Record<string, ArgSpecDefaultValue>>;
/**
* Helper type for the return value of {@link AppiumSchema.getDefaults}
*/
export type DefaultValues<Flattened extends boolean | undefined> = Record<string, Flattened extends true ? ArgSpecDefaultValue : ArgSpecDefaultValue | NestedArgSpecDefaultValue>;
export type AllowedSchemaExtension = ".json" | ".js" | ".cjs";
import { ArgSpec } from './arg-spec';
//# sourceMappingURL=schema.d.ts.map