appium
Version:
Automation for Apps.
533 lines • 18 kB
TypeScript
/**
* This is needed to ensure proper module resolution for installed extensions,
* especially ESM ones.
*
* @param {ExtensionConfig<ExtensionType>} driverConfig
* @param {ExtensionConfig<ExtensionType>} pluginConfig
* @param {import('@appium/types').AppiumLogger} logger
*/
export function injectAppiumSymlinks(driverConfig: ExtensionConfig<ExtensionType>, pluginConfig: ExtensionConfig<ExtensionType>, logger: import("@appium/types").AppiumLogger): Promise<void>;
export default ExtensionCliCommand;
export { ExtensionCliCommand as ExtensionCommand };
/**
* Options for the {@linkcode ExtensionCliCommand} constructor
*/
export type ExtensionCommandOptions<ExtType extends ExtensionType> = {
/**
* - the `DriverConfig` or `PluginConfig` instance used for this command
*/
config: ExtensionConfig<ExtType>;
/**
* - whether the output of this command should be JSON or text
*/
json: boolean;
};
/**
* Extra stuff about extensions; used indirectly by {@linkcode ExtensionCliCommand.list}.
*/
export type ExtensionListMetadata = {
/**
* - If `true`, the extension is installed
*/
installed: boolean;
/**
* - If the extension is installed and the latest
*/
upToDate: boolean;
/**
* - If the extension is installed, the version it can be updated to
*/
updateVersion: string | null;
/**
* - Same as above, but a major version bump
*/
unsafeUpdateVersion: string | null;
/**
* - Update check error message (if present)
*/
updateError?: string | undefined;
/**
* - If Appium is run from an extension's working copy
*/
devMode?: boolean | undefined;
/**
* - Repository URL for the extension (if available)
*/
repositoryUrl?: string | undefined;
};
export type ExtensionType = import("@appium/types").ExtensionType;
export type DriverType = import("@appium/types").DriverType;
export type PluginType = import("@appium/types").PluginType;
export type ExtRecord<ExtType extends ExtensionType> = import("appium/types").ExtRecord<ExtType>;
export type ExtensionConfig<ExtType extends ExtensionType> = import("../extension/extension-config").ExtensionConfig<ExtType>;
export type ExtMetadata<ExtType extends ExtensionType> = import("appium/types").ExtMetadata<ExtType>;
export type ExtManifest<ExtType extends ExtensionType> = import("appium/types").ExtManifest<ExtType>;
export type ExtPackageJson<ExtType extends ExtensionType> = import("appium/types").ExtPackageJson<ExtType>;
export type ExtInstallReceipt<ExtType extends ExtensionType> = import("appium/types").ExtInstallReceipt<ExtType>;
/**
* Possible return value for {@linkcode ExtensionCliCommand.list}
*/
export type ExtensionListData<ExtType extends ExtensionType> = Partial<ExtManifest<ExtType>> & Partial<ExtensionListMetadata>;
export type InstalledExtensionListData<ExtType extends ExtensionType> = ExtManifest<ExtType> & ExtensionListMetadata;
/**
* Return value of {@linkcode ExtensionCliCommand.list}.
*/
export type ExtensionList<ExtType extends ExtensionType> = Record<string, ExtensionListData<ExtType>>;
/**
* Options for {@linkcode ExtensionCliCommand._run}.
*/
export type RunOptions = {
/**
* - name of the extension to run a script from
*/
installSpec: string;
/**
* - name of the script to run. If not provided
* then all available script names will be printed
*/
scriptName?: string | undefined;
/**
* - arguments to pass to the script
*/
extraArgs?: string[] | undefined;
/**
* - if true, will buffer the output of the script and return it
*/
bufferOutput?: boolean | undefined;
};
/**
* Options for {@linkcode ExtensionCliCommand.doctor}.
*/
export type DoctorOptions = {
/**
* - name of the extension to run doctor checks for
*/
installSpec: string;
};
/**
* Return value of {@linkcode ExtensionCliCommand._run}
*/
export type RunOutput = {
/**
* - script output if `bufferOutput` was `true` in {@linkcode RunOptions}
*/
output?: string[] | undefined;
};
/**
* Options for {@linkcode ExtensionCliCommand._update}.
*/
export type ExtensionUpdateOpts = {
/**
* - the name of the extension to update
*/
installSpec: string;
/**
* - if true, will perform unsafe updates past major revision boundaries
*/
unsafe: boolean;
};
/**
* Return value of {@linkcode ExtensionCliCommand._update}.
*/
export type ExtensionUpdateResult = {
/**
* - map of ext names to error objects
*/
errors: Record<string, Error>;
/**
* - map of ext names to {@linkcode UpdateReport}s
*/
updates: Record<string, UpdateReport>;
};
/**
* Part of result of {@linkcode ExtensionCliCommand._update}.
*/
export type UpdateReport = {
/**
* - version the extension was updated from
*/
from: string;
/**
* - version the extension was updated to
*/
to: string;
};
/**
* Options for {@linkcode ExtensionCliCommand._uninstall}.
*/
export type UninstallOpts = {
/**
* - the name or spec of an extension to uninstall
*/
installSpec: string;
};
/**
* Used by {@linkcode ExtensionCliCommand.getPostInstallText}
*/
export type ExtensionArgs = {
/**
* - the name of an extension
*/
extName: string;
/**
* - the data for an installed extension
*/
extData: object;
};
/**
* Options for {@linkcode ExtensionCliCommand.installViaNpm}
*/
export type InstallViaNpmArgs = {
/**
* - the name or spec of an extension to install
*/
installSpec: string;
/**
* - the NPM package name of the extension
*/
pkgName: string;
/**
* - type of install
*/
installType: import("appium/types").InstallType;
/**
* - the specific version of the NPM package
*/
pkgVer?: string | undefined;
};
/**
* Object returned by {@linkcode ExtensionCliCommand.checkForExtensionUpdate}
*/
export type PossibleUpdates = {
/**
* - current version
*/
current: string;
/**
* - version we can safely update to if it exists, or null
*/
safeUpdate: string | null;
/**
* - version we can unsafely update to if it exists, or null
*/
unsafeUpdate: string | null;
};
/**
* Options for {@linkcode ExtensionCliCommand._install}
*/
export type InstallOpts = {
/**
* - the name or spec of an extension to install
*/
installSpec: string;
/**
* - how to install this extension. One of the INSTALL_TYPES
*/
installType: InstallType;
/**
* - for git/github installs, the extension node package name
*/
packageName?: string | undefined;
};
export type KnownExtensions<ExtType extends ExtensionType> = ExtType extends DriverType ? typeof import("../constants").KNOWN_DRIVERS : ExtType extends PluginType ? typeof import("../constants").KNOWN_PLUGINS : never;
export type ListOptions = {
/**
* - whether should show only installed extensions
*/
showInstalled: boolean;
/**
* - whether should show available updates
*/
showUpdates: boolean;
/**
* - whether to show additional data from the extension
*/
verbose?: boolean | undefined;
};
/**
* Opts for {@linkcode ExtensionCliCommand.getInstallationReceipt}
*/
export type GetInstallationReceiptOpts<ExtType extends ExtensionType> = {
installPath: string;
installSpec: string;
pkg: ExtPackageJson<ExtType>;
installType: InstallType;
};
export type InstallType = import("appium/types").InstallType;
/**
* @template {ExtensionType} ExtType
*/
declare class ExtensionCliCommand<ExtType extends ExtensionType> {
/**
* Build an ExtensionCommand
* @param {ExtensionCommandOptions<ExtType>} opts
*/
constructor({ config, json }: ExtensionCommandOptions<ExtType>);
/**
* This is the `DriverConfig` or `PluginConfig`, depending on `ExtType`.
* @type {ExtensionConfig<ExtType>}
*/
config: ExtensionConfig<ExtType>;
/**
* {@linkcode Record} of official plugins or drivers.
* @type {KnownExtensions<ExtType>}
*/
knownExtensions: KnownExtensions<ExtType>;
/**
* If `true`, command output has been requested as JSON.
* @type {boolean}
*/
isJsonOutput: boolean;
log: console.CliConsole;
/**
* `driver` or `plugin`, depending on the `ExtensionConfig`.
*/
get type(): ExtType;
/**
* Logs a message and returns an {@linkcode Error} to throw.
*
* For TS to understand that a function throws an exception, it must actually throw an exception--
* in other words, _calling_ a function which is guaranteed to throw an exception is not enough--
* nor is something like `@returns {never}` which does not imply a thrown exception.
*
* @param {string} message
* @protected
* @throws {Error}
*/
protected _createFatalError(message: string): Error;
/**
* Take a CLI parse and run an extension command based on its type
*
* @param {object} args - a key/value object with CLI flags and values
* @return {Promise<object>} the result of the specific command which is executed
*/
execute(args: object): Promise<object>;
/**
* List extensions
*
* @template {ExtensionType} ExtType
* @param {ListOptions} opts
* @return {Promise<ExtensionList<ExtType>>} map of extension names to extension data
*/
list<ExtType_1 extends ExtensionType>({ showInstalled, showUpdates, verbose }: ListOptions): Promise<ExtensionList<ExtType_1>>;
/**
* Build the initial list data structure from installed and known extensions
*
* @template {ExtensionType} ExtType
* @param {boolean} showInstalled
* @returns {ExtensionList<ExtType>}
* @private
*/
private _buildListData;
/**
* Check for available updates for installed extensions
*
* @template {ExtensionType} ExtType
* @param {ExtensionList<ExtType>} listData
* @param {boolean} showUpdates
* @param {string} lsMsg
* @returns {Promise<void>}
* @private
*/
private _checkForUpdates;
/**
* Add repository URLs to list data for all extensions
*
* @template {ExtensionType} ExtType
* @param {ExtensionList<ExtType>} listData
* @returns {Promise<void>}
* @private
*/
private _addRepositoryUrlsToListData;
/**
* Display normal formatted output
*
* @template {ExtensionType} ExtType
* @param {ExtensionList<ExtType>} listData
* @param {boolean} showUpdates
* @returns {Promise<ExtensionList<ExtType>>}
* @private
*/
private _displayNormalListOutput;
/**
* Format a single extension line for display
*
* @template {ExtensionType} ExtType
* @param {string} name
* @param {ExtensionListData<ExtType>} data
* @param {boolean} showUpdates
* @returns {Promise<string>}
* @private
*/
private _formatExtensionLine;
/**
* Format installation status text
*
* @template {ExtensionType} ExtType
* @param {InstalledExtensionListData<ExtType>} data
* @returns {string}
* @private
*/
private _formatInstallText;
/**
* Format update information text
*
* @template {ExtensionType} ExtType
* @param {InstalledExtensionListData<ExtType>} data
* @returns {string}
* @private
*/
private _formatUpdateText;
/**
* Get repository URL from package data
*
* @template {ExtensionType} ExtType
* @param {ExtensionListData<ExtType>} data
* @returns {Promise<string|null>}
* @private
*/
private _getRepositoryUrl;
/**
* Get repository URL from installed extension's package.json
*
* @template {ExtensionType} ExtType
* @param {InstalledExtensionListData<ExtType>} data
* @returns {Promise<string|null>}
* @private
*/
private _getRepositoryUrlFromInstalled;
/**
* Get repository URL from npm for a package name
*
* @param {string} pkgName
* @returns {Promise<string|null>}
* @private
*/
private _getRepositoryUrlFromNpm;
/**
* Checks whether the given extension is compatible with the currently installed server
*
* @param {InstallViaNpmArgs} installViaNpmOpts
* @returns {Promise<void>}
*/
_checkInstallCompatibility({ installSpec, pkgName, pkgVer, installType }: InstallViaNpmArgs): Promise<void>;
/**
* Install an extension
*
* @param {InstallOpts} opts
* @return {Promise<ExtRecord<ExtType>>} map of all installed extension names to extension data
*/
_install({ installSpec, installType, packageName }: InstallOpts): Promise<ExtRecord<ExtType>>;
/**
* Install an extension via NPM
*
* @param {InstallViaNpmArgs} args
* @returns {Promise<ExtInstallReceipt<ExtType>>}
*/
installViaNpm({ installSpec, pkgName, pkgVer, installType }: InstallViaNpmArgs): Promise<ExtInstallReceipt<ExtType>>;
/**
* Get the text which should be displayed to the user after an extension has been installed. This
* is designed to be overridden by drivers/plugins with their own particular text.
*
* @param {ExtensionArgs} args
* @returns {string}
*/
getPostInstallText(args: ExtensionArgs): string;
/**
* Once a package is installed on-disk, this gathers some necessary metadata for validation.
*
* @param {GetInstallationReceiptOpts<ExtType>} opts
* @returns {ExtInstallReceipt<ExtType>}
*/
getInstallationReceipt({ pkg, installPath, installType, installSpec }: GetInstallationReceiptOpts<ExtType>): ExtInstallReceipt<ExtType>;
/**
* Validates the _required_ root fields of an extension's `package.json` file.
*
* These required fields are:
* - `name`
* - `version`
* - `appium`
* @param {import('type-fest').PackageJson} pkg - `package.json` of extension
* @param {string} installSpec - Extension name/spec
* @throws {ReferenceError} If `package.json` has a missing or invalid field
* @returns {pkg is ExtPackageJson<ExtType>}
*/
validatePackageJson(pkg: import("type-fest").PackageJson, installSpec: string): pkg is ExtPackageJson<ExtType>;
/**
* For any `package.json` fields which a particular type of extension requires, validate the
* presence and form of those fields on the `package.json` data, throwing an error if anything is
* amiss.
*
* @param {ExtMetadata<ExtType>} extMetadata - the data in the "appium" field of `package.json` for an extension
* @param {string} installSpec - Extension name/spec
*/
validateExtensionFields(extMetadata: ExtMetadata<ExtType>, installSpec: string): void;
/**
* Uninstall an extension.
*
* First tries to do this via `npm uninstall`, but if that fails, just `rm -rf`'s the extension dir.
*
* Will only remove the extension from the manifest if it has been successfully removed.
*
* @param {UninstallOpts} opts
* @return {Promise<ExtRecord<ExtType>>} map of all installed extension names to extension data (without the extension just uninstalled)
*/
_uninstall({ installSpec }: UninstallOpts): Promise<ExtRecord<ExtType>>;
/**
* Attempt to update one or more drivers using NPM
*
* @param {ExtensionUpdateOpts} updateSpec
* @return {Promise<ExtensionUpdateResult>}
*/
_update({ installSpec, unsafe }: ExtensionUpdateOpts): Promise<ExtensionUpdateResult>;
/**
* Given an extension name, figure out what its highest possible version upgrade is, and also the
* highest possible safe upgrade.
*
* @param {string} ext - name of extension
* @return {Promise<PossibleUpdates>}
*/
checkForExtensionUpdate(ext: string): Promise<PossibleUpdates>;
/**
* Actually update an extension installed by NPM, using the NPM cli. And update the installation
* manifest.
*
* @param {string} installSpec - name of extension to update
* @param {string} version - version string identifier to update extension to
* @returns {Promise<void>}
*/
updateExtension(installSpec: string, version: string): Promise<void>;
/**
* Just wraps {@linkcode child_process.spawn} with some default options
*
* @param {string} cwd - CWD
* @param {string} script - Path to script
* @param {string[]} args - Extra args for script
* @param {import('child_process').SpawnOptions} opts - Options
* @returns {import('node:child_process').ChildProcess}
*/
_runUnbuffered(cwd: string, script: string, args?: string[], opts?: import("child_process").SpawnOptions): import("node:child_process").ChildProcess;
/**
* Runs doctor checks for the given extension.
*
* @param {DoctorOptions} opts
* @returns {Promise<number>} The amount of Doctor checks that were
* successfully loaded and executed for the given extension
* @throws {Error} If any of the mandatory Doctor checks fails.
*/
_doctor({ installSpec }: DoctorOptions): Promise<number>;
/**
* Runs a script cached inside the `scripts` field under `appium`
* inside of the extension's `package.json` file. Will throw
* an error if the driver/plugin does not contain a `scripts` field
* underneath the `appium` field in its `package.json`, if the
* `scripts` field is not a plain object, or if the `scriptName` is
* not found within `scripts` object.
*
* @param {RunOptions} opts
* @return {Promise<RunOutput>}
*/
_run({ installSpec, scriptName, extraArgs, bufferOutput }: RunOptions): Promise<RunOutput>;
}
import { console } from '@appium/support';
//# sourceMappingURL=extension-command.d.ts.map