UNPKG

appium

Version:

Automation for Apps.

324 lines (308 loc) 7.85 kB
import _ from 'lodash'; import { DRIVER_TYPE, PLUGIN_TYPE, EXT_SUBCOMMAND_INSTALL, EXT_SUBCOMMAND_LIST, EXT_SUBCOMMAND_RUN, EXT_SUBCOMMAND_UNINSTALL, EXT_SUBCOMMAND_UPDATE, EXT_SUBCOMMAND_DOCTOR, } from '../constants'; import {INSTALL_TYPES} from '../extension/extension-config'; import {toParserArgs} from '../schema/cli-args'; const DRIVER_EXAMPLE = 'xcuitest'; const PLUGIN_EXAMPLE = 'images'; /** * This is necessary because we pass the array into `argparse`. `argparse` is bad and mutates things. We don't want that. * Bad `argparse`! Bad! */ const INSTALL_TYPES_ARRAY = [...INSTALL_TYPES]; /** @type {Set<ExtensionType>} */ const EXTENSION_TYPES = new Set([DRIVER_TYPE, PLUGIN_TYPE]); // this set of args works for both drivers and plugins ('extensions') /** @type {ArgumentDefinitions} */ const globalExtensionArgs = new Map([ [ ['--json'], { required: false, default: false, action: 'store_true', help: 'Return output in JSON format', dest: 'json', }, ], ]); /** * Builds a Record of extension types to a Record of subcommands to their argument definitions */ const getExtensionArgs = _.memoize(function getExtensionArgs() { const extensionArgs = {}; for (const type of EXTENSION_TYPES) { extensionArgs[type] = { [EXT_SUBCOMMAND_LIST]: makeListArgs(type), [EXT_SUBCOMMAND_INSTALL]: makeInstallArgs(type), [EXT_SUBCOMMAND_UNINSTALL]: makeUninstallArgs(type), [EXT_SUBCOMMAND_UPDATE]: makeUpdateArgs(type), [EXT_SUBCOMMAND_RUN]: makeRunArgs(type), [EXT_SUBCOMMAND_DOCTOR]: makeDoctorArgs(type), }; } return /** @type {Record<ExtensionType, Record<import('appium/types').CliExtensionSubcommand,ArgumentDefinitions>>} */ ( extensionArgs ); }); /** * Makes the opts for the `list` subcommand for each extension type. * @param {ExtensionType} type * @returns {ArgumentDefinitions} */ function makeListArgs(type) { return new Map([ ...globalExtensionArgs, [ ['--installed'], { required: false, default: false, action: 'store_true', help: `List only installed ${type}s`, dest: 'showInstalled', }, ], [ ['--updates'], { required: false, default: false, action: 'store_true', help: `Show information about available ${type} updates`, dest: 'showUpdates', }, ], [ ['--verbose'], { required: false, default: false, action: 'store_true', help: `Show more information about each ${type}`, dest: 'verbose', }, ], ]); } /** * Makes the opts for the `install` subcommand for each extension type * @param {ExtensionType} type * @returns {ArgumentDefinitions} */ function makeInstallArgs(type) { return new Map([ ...globalExtensionArgs, [ [type], { type: 'str', help: `Name of the ${type} to install, for example: ` + (type === DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE), }, ], [ ['--source'], { required: false, default: null, choices: INSTALL_TYPES_ARRAY, help: `Where to look for the ${type} if it is not one of Appium's official ` + `${type}s. Possible values: ${INSTALL_TYPES_ARRAY.join(', ')}`, dest: 'installType', }, ], [ ['--package'], { required: false, default: null, type: 'str', help: `The Node.js package name of the ${type}. ` + `Required if "source" is set to "git" or "github".`, dest: 'packageName', }, ], ]); } /** * Makes the opts for the `uninstall` subcommand for each extension type * @param {ExtensionType} type * @returns {ArgumentDefinitions} */ function makeUninstallArgs(type) { return new Map([ ...globalExtensionArgs, [ [type], { type: 'str', help: `Name of the ${type} to uninstall, for example: ` + (type === DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE), }, ], ]); } /** * Makes the opts for the `doctor` subcommand for each extension type * @param {ExtensionType} type * @returns {ArgumentDefinitions} */ function makeDoctorArgs(type) { return new Map([ ...globalExtensionArgs, [ [type], { type: 'str', help: `Name of the ${type} to run doctor checks for, for example: ` + (type === DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE), }, ], ]); } /** * Makes the opts for the `update` subcommand for each extension type * @param {ExtensionType} type * @returns {ArgumentDefinitions} */ function makeUpdateArgs(type) { return new Map([ ...globalExtensionArgs, [ [type], { type: 'str', help: `Name of the ${type} to update, or "installed" to update all installed ${type}s. ` + `To see available ${type} updates, run "appium ${type} list --installed --updates". ` + 'For example: ' + (type === DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE), }, ], [ ['--unsafe'], { required: false, default: false, action: 'store_true', help: 'Include any available major revision updates, which may have breaking changes', }, ], ]); } /** * Makes the opts for the `run` subcommand for each extension type * @param {ExtensionType} type * @returns {ArgumentDefinitions} */ function makeRunArgs(type) { return new Map([ ...globalExtensionArgs, [ [type], { type: 'str', help: `Name of the ${type} to run a script from, for example: ` + (type === DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE), }, ], [ ['scriptName'], { default: null, nargs: '?', type: 'str', help: `Name of the ${type} script to run. If not provided, return a list ` + `of available scripts for this ${type}.`, }, ], ]); } /** * Derives the options for the `server` command from the schema, and adds the arguments * which are disallowed in the config file. * @returns {ArgumentDefinitions} */ function getServerArgs() { return new Map([...toParserArgs(), ...serverArgsDisallowedInConfig]); } /** * These don't make sense in the context of a config file for obvious reasons. * @type {ArgumentDefinitions} */ const serverArgsDisallowedInConfig = new Map([ [ ['--shell'], { required: false, help: 'Enter REPL mode', action: 'store_const', const: true, dest: 'shell', }, ], [ ['--show-build-info'], { dest: 'showBuildInfo', action: 'store_const', const: true, required: false, help: 'Show info about the Appium build and exit', }, ], [ ['--show-debug-info'], { dest: 'showDebugInfo', action: 'store_const', const: true, required: false, help: 'Show debug info about the current Appium deployment and exit', }, ], [ ['--show-config'], { dest: 'showConfig', action: 'store_const', const: true, required: false, help: 'Show the current Appium configuration and exit', }, ], [ ['--config'], { dest: 'configFile', type: 'str', required: false, help: 'Explicit path to Appium configuration file', }, ], ]); export {getServerArgs, getExtensionArgs}; /** * @typedef {import('@appium/types').ExtensionType} ExtensionType */ /** * A tuple of argument aliases and argument options * @typedef {Map<[name: string]|[name: string, alias: string],import('argparse').ArgumentOptions>} ArgumentDefinitions */