UNPKG

appium-webdriveragent-driver

Version:
369 lines (288 loc) 18.8 kB
'use strict'; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _getIterator = require('babel-runtime/core-js/get-iterator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; Object.defineProperty(exports, '__esModule', { value: true }); var _appiumXcode = require('appium-xcode'); var _appiumXcode2 = _interopRequireDefault(_appiumXcode); var _appiumSupport = require('appium-support'); var _teen_process = require('teen_process'); var _logger = require('./logger'); var _logger2 = _interopRequireDefault(_logger); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var SAFARI_LAUNCHER_DIR = _path2['default'].resolve(__dirname, '..', '..', 'build', 'SafariLauncher'); var SAFARI_LAUNCHER_APP_FILE = _path2['default'].resolve(__dirname, '..', '..', 'build', 'SafariLauncher', 'SafariLauncher.app'); var SAFARI_LAUNCHER_REPO = _path2['default'].resolve(__dirname, '..', '..', 'node_modules', 'safari-launcher'); var SAFARI_LAUNCHER_CONFIG_FILE = _path2['default'].resolve(SAFARI_LAUNCHER_REPO, 'build.xconfig'); var SAFARI_LAUNCHER_BUNDLE = 'com.bytearc.SafariLauncher'; var sdks = ['iphoneos']; function cleanApp(appRoot, sdk) { return _regeneratorRuntime.async(function cleanApp$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: _logger2['default'].debug('Cleaning SafariLauncher for ' + sdk); context$1$0.prev = 1; context$1$0.next = 4; return _regeneratorRuntime.awrap((0, _teen_process.exec)('xcodebuild', ['-sdk', sdk, 'clean'], { cwd: appRoot })); case 4: context$1$0.next = 10; break; case 6: context$1$0.prev = 6; context$1$0.t0 = context$1$0['catch'](1); _logger2['default'].error(context$1$0.t0); throw context$1$0.t0; case 10: case 'end': return context$1$0.stop(); } }, null, this, [[1, 6]]); } function cleanAll() { var sdkVer, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, sdk, fullSdk; return _regeneratorRuntime.async(function cleanAll$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: _logger2['default'].info("Cleaning SafariLauncher"); context$1$0.next = 3; return _regeneratorRuntime.awrap(_appiumXcode2['default'].getMaxIOSSDK()); case 3: sdkVer = context$1$0.sent; _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; context$1$0.prev = 7; _iterator = _getIterator(sdks); case 9: if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { context$1$0.next = 17; break; } sdk = _step.value; fullSdk = sdk + sdkVer; context$1$0.next = 14; return _regeneratorRuntime.awrap(cleanApp(SAFARI_LAUNCHER_REPO, fullSdk)); case 14: _iteratorNormalCompletion = true; context$1$0.next = 9; break; case 17: context$1$0.next = 23; break; case 19: context$1$0.prev = 19; context$1$0.t0 = context$1$0['catch'](7); _didIteratorError = true; _iteratorError = context$1$0.t0; case 23: context$1$0.prev = 23; context$1$0.prev = 24; if (!_iteratorNormalCompletion && _iterator['return']) { _iterator['return'](); } case 26: context$1$0.prev = 26; if (!_didIteratorError) { context$1$0.next = 29; break; } throw _iteratorError; case 29: return context$1$0.finish(26); case 30: return context$1$0.finish(23); case 31: context$1$0.next = 33; return _regeneratorRuntime.awrap(_appiumSupport.fs.rimraf(SAFARI_LAUNCHER_DIR)); case 33: _logger2['default'].info("Finished cleaning SafariLauncher"); case 34: case 'end': return context$1$0.stop(); } }, null, this, [[7, 19, 23, 31], [24,, 26, 30]]); } function buildApp(appRoot, sdk) { var args; return _regeneratorRuntime.async(function buildApp$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.prev = 0; _logger2['default'].debug('Building SafariLauncher for ' + sdk); args = ['-sdk', sdk, '-xcconfig', SAFARI_LAUNCHER_CONFIG_FILE]; context$1$0.next = 5; return _regeneratorRuntime.awrap((0, _teen_process.exec)('xcodebuild', args, { cwd: appRoot })); case 5: context$1$0.next = 11; break; case 7: context$1$0.prev = 7; context$1$0.t0 = context$1$0['catch'](0); _logger2['default'].error(context$1$0.t0); throw context$1$0.t0; case 11: case 'end': return context$1$0.stop(); } }, null, this, [[0, 7]]); } function buildAll() { var sdkVer, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, sdk, fullSdk; return _regeneratorRuntime.async(function buildAll$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: _logger2['default'].info("Building SafariLauncher"); context$1$0.next = 3; return _regeneratorRuntime.awrap(_appiumXcode2['default'].getMaxIOSSDK()); case 3: sdkVer = context$1$0.sent; _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _iteratorError2 = undefined; context$1$0.prev = 7; _iterator2 = _getIterator(sdks); case 9: if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) { context$1$0.next = 17; break; } sdk = _step2.value; fullSdk = sdk + sdkVer; context$1$0.next = 14; return _regeneratorRuntime.awrap(buildApp(SAFARI_LAUNCHER_REPO, fullSdk)); case 14: _iteratorNormalCompletion2 = true; context$1$0.next = 9; break; case 17: context$1$0.next = 23; break; case 19: context$1$0.prev = 19; context$1$0.t0 = context$1$0['catch'](7); _didIteratorError2 = true; _iteratorError2 = context$1$0.t0; case 23: context$1$0.prev = 23; context$1$0.prev = 24; if (!_iteratorNormalCompletion2 && _iterator2['return']) { _iterator2['return'](); } case 26: context$1$0.prev = 26; if (!_didIteratorError2) { context$1$0.next = 29; break; } throw _iteratorError2; case 29: return context$1$0.finish(26); case 30: return context$1$0.finish(23); case 31: _logger2['default'].info("Finished building SafariLauncher"); case 32: case 'end': return context$1$0.stop(); } }, null, this, [[7, 19, 23, 31], [24,, 26, 30]]); } function renameAll() { var file; return _regeneratorRuntime.async(function renameAll$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.prev = 0; _logger2['default'].info("Renaming SafariLauncher"); context$1$0.next = 4; return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(SAFARI_LAUNCHER_DIR)); case 4: if (context$1$0.sent) { context$1$0.next = 7; break; } context$1$0.next = 7; return _regeneratorRuntime.awrap(_appiumSupport.fs.mkdir(SAFARI_LAUNCHER_DIR)); case 7: file = _path2['default'].resolve(SAFARI_LAUNCHER_REPO, 'build', 'Release-iphoneos', 'SafariLauncher.app'); context$1$0.next = 10; return _regeneratorRuntime.awrap(_appiumSupport.fs.rename(file, SAFARI_LAUNCHER_APP_FILE)); case 10: _logger2['default'].info("Finished renaming SafariLauncher"); context$1$0.next = 17; break; case 13: context$1$0.prev = 13; context$1$0.t0 = context$1$0['catch'](0); _logger2['default'].warn("Could not rename SafariLauncher"); _logger2['default'].errorAndThrow(context$1$0.t0); case 17: case 'end': return context$1$0.stop(); } }, null, this, [[0, 13]]); } function updateConfig() { var config; return _regeneratorRuntime.async(function updateConfig$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: _logger2['default'].info('Updating config for Safari Launcher'); config = 'BUNDLE_ID = ' + SAFARI_LAUNCHER_BUNDLE + '\nIDENTITY_NAME = iPhone Developer\nIDENTITY_CODE ='; context$1$0.next = 4; return _regeneratorRuntime.awrap(_appiumSupport.fs.writeFile(SAFARI_LAUNCHER_CONFIG_FILE, config)); case 4: case 'end': return context$1$0.stop(); } }, null, this); } function install() { return _regeneratorRuntime.async(function install$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return _regeneratorRuntime.awrap(cleanAll()); case 2: context$1$0.next = 4; return _regeneratorRuntime.awrap(updateConfig()); case 4: context$1$0.next = 6; return _regeneratorRuntime.awrap(buildAll()); case 6: context$1$0.next = 8; return _regeneratorRuntime.awrap(renameAll()); case 8: case 'end': return context$1$0.stop(); } }, null, this); } function needsInstall() { var exists; return _regeneratorRuntime.async(function needsInstall$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: _logger2['default'].debug('Checking for presence of SafariLauncher at \'' + SAFARI_LAUNCHER_APP_FILE + '\''); context$1$0.next = 3; return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(SAFARI_LAUNCHER_APP_FILE)); case 3: exists = context$1$0.sent; _logger2['default'].debug('SafariLauncher ' + (exists ? 'exists' : 'does not exist')); return context$1$0.abrupt('return', !exists); case 6: case 'end': return context$1$0.stop(); } }, null, this); } exports.install = install; exports.needsInstall = needsInstall; exports.SAFARI_LAUNCHER_APP_FILE = SAFARI_LAUNCHER_APP_FILE; exports.SAFARI_LAUNCHER_BUNDLE = SAFARI_LAUNCHER_BUNDLE; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zYWZhcmktbGF1bmNoZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzJCQUFrQixjQUFjOzs7OzZCQUNiLGdCQUFnQjs7NEJBQ2QsY0FBYzs7c0JBQ2hCLFVBQVU7Ozs7b0JBQ1osTUFBTTs7OztBQUd2QixJQUFNLG1CQUFtQixHQUFHLGtCQUFLLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDaEIsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDekUsSUFBTSx3QkFBd0IsR0FBRyxrQkFBSyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFDekIsb0JBQW9CLENBQUMsQ0FBQztBQUNwRSxJQUFNLG9CQUFvQixHQUFHLGtCQUFLLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDckIsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDN0UsSUFBTSwyQkFBMkIsR0FBRyxrQkFBSyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDeEYsSUFBTSxzQkFBc0IsR0FBRyw0QkFBNEIsQ0FBQzs7QUFFNUQsSUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFMUIsU0FBZSxRQUFRLENBQUUsT0FBTyxFQUFFLEdBQUc7Ozs7QUFDbkMsNEJBQU8sS0FBSyxrQ0FBZ0MsR0FBRyxDQUFHLENBQUM7Ozt5Q0FFM0Msd0JBQUssWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUMsQ0FBQzs7Ozs7Ozs7OztBQUVoRSw0QkFBTyxLQUFLLGdCQUFLLENBQUM7Ozs7Ozs7O0NBR3JCOztBQUVELFNBQWUsUUFBUTtNQUVqQixNQUFNLGtGQUNGLEdBQUcsRUFDTCxPQUFPOzs7OztBQUhiLDRCQUFPLElBQUksQ0FBQyx5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eEIsd0JBQXdCO1FBQUUsc0JBQXNCLEdBQXRCLHNCQUFzQiIsImZpbGUiOiJsaWIvc2FmYXJpLWxhdW5jaGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHhjb2RlIGZyb20gJ2FwcGl1bS14Y29kZSc7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuXG5jb25zdCBTQUZBUklfTEFVTkNIRVJfRElSID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVpbGQnLCAnU2FmYXJpTGF1bmNoZXInKTtcbmNvbnN0IFNBRkFSSV9MQVVOQ0hFUl9BUFBfRklMRSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkJywgJ1NhZmFyaUxhdW5jaGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2FmYXJpTGF1bmNoZXIuYXBwJyk7XG5jb25zdCBTQUZBUklfTEFVTkNIRVJfUkVQTyA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9kZV9tb2R1bGVzJywgJ3NhZmFyaS1sYXVuY2hlcicpO1xuY29uc3QgU0FGQVJJX0xBVU5DSEVSX0NPTkZJR19GSUxFID0gcGF0aC5yZXNvbHZlKFNBRkFSSV9MQVVOQ0hFUl9SRVBPLCAnYnVpbGQueGNvbmZpZycpO1xuY29uc3QgU0FGQVJJX0xBVU5DSEVSX0JVTkRMRSA9ICdjb20uYnl0ZWFyYy5TYWZhcmlMYXVuY2hlcic7XG5cbmNvbnN0IHNka3MgPSBbJ2lwaG9uZW9zJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFuQXBwIChhcHBSb290LCBzZGspIHtcbiAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyBTYWZhcmlMYXVuY2hlciBmb3IgJHtzZGt9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIFsnLXNkaycsIHNkaywgJ2NsZWFuJ10sIHtjd2Q6IGFwcFJvb3R9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFuQWxsICgpIHtcbiAgbG9nZ2VyLmluZm8oXCJDbGVhbmluZyBTYWZhcmlMYXVuY2hlclwiKTtcbiAgbGV0IHNka1ZlciA9IGF3YWl0IHhjb2RlLmdldE1heElPU1NESygpO1xuICBmb3IobGV0IHNkayBvZiBzZGtzKSB7XG4gICAgbGV0IGZ1bGxTZGsgPSBzZGsrc2RrVmVyO1xuICAgIGF3YWl0IGNsZWFuQXBwKFNBRkFSSV9MQVVOQ0hFUl9SRVBPLCBmdWxsU2RrKTtcbiAgfVxuICBhd2FpdCBmcy5yaW1yYWYoU0FGQVJJX0xBVU5DSEVSX0RJUik7XG4gIGxvZ2dlci5pbmZvKFwiRmluaXNoZWQgY2xlYW5pbmcgU2FmYXJpTGF1bmNoZXJcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwKGFwcFJvb3QsIHNkaykge1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQnVpbGRpbmcgU2FmYXJpTGF1bmNoZXIgZm9yICR7c2RrfWApO1xuICAgIGxldCBhcmdzID0gWyctc2RrJywgc2RrLCAnLXhjY29uZmlnJywgU0FGQVJJX0xBVU5DSEVSX0NPTkZJR19GSUxFXTtcbiAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgYXJncywge1xuICAgICAgY3dkOiBhcHBSb290XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEFsbCAoKSB7XG4gIGxvZ2dlci5pbmZvKFwiQnVpbGRpbmcgU2FmYXJpTGF1bmNoZXJcIik7XG4gIGxldCBzZGtWZXIgPSBhd2FpdCB4Y29kZS5nZXRNYXhJT1NTREsoKTtcbiAgZm9yIChsZXQgc2RrIG9mIHNka3MpIHtcbiAgICBsZXQgZnVsbFNkayA9IHNkayArIHNka1ZlcjtcbiAgICBhd2FpdCBidWlsZEFwcChTQUZBUklfTEFVTkNIRVJfUkVQTywgZnVsbFNkayk7XG4gIH1cbiAgbG9nZ2VyLmluZm8oXCJGaW5pc2hlZCBidWlsZGluZyBTYWZhcmlMYXVuY2hlclwiKTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmFtZUFsbCAoKSB7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmluZm8oXCJSZW5hbWluZyBTYWZhcmlMYXVuY2hlclwiKTtcbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhTQUZBUklfTEFVTkNIRVJfRElSKSkge1xuICAgICAgYXdhaXQgZnMubWtkaXIoU0FGQVJJX0xBVU5DSEVSX0RJUik7XG4gICAgfVxuXG4gICAgbGV0IGZpbGUgPSBwYXRoLnJlc29sdmUoU0FGQVJJX0xBVU5DSEVSX1JFUE8sICdidWlsZCcsICdSZWxlYXNlLWlwaG9uZW9zJywgJ1NhZmFyaUxhdW5jaGVyLmFwcCcpO1xuICAgIGF3YWl0IGZzLnJlbmFtZShcbiAgICAgIGZpbGUsXG4gICAgICBTQUZBUklfTEFVTkNIRVJfQVBQX0ZJTEUpO1xuICAgIGxvZ2dlci5pbmZvKFwiRmluaXNoZWQgcmVuYW1pbmcgU2FmYXJpTGF1bmNoZXJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiQ291bGQgbm90IHJlbmFtZSBTYWZhcmlMYXVuY2hlclwiKTtcbiAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhlcnIpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNvbmZpZyAoKSB7XG4gIGxvZ2dlci5pbmZvKCdVcGRhdGluZyBjb25maWcgZm9yIFNhZmFyaSBMYXVuY2hlcicpO1xuICBsZXQgY29uZmlnID0gYEJVTkRMRV9JRCA9ICR7U0FGQVJJX0xBVU5DSEVSX0JVTkRMRX1cbklERU5USVRZX05BTUUgPSBpUGhvbmUgRGV2ZWxvcGVyXG5JREVOVElUWV9DT0RFID1gO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoU0FGQVJJX0xBVU5DSEVSX0NPTkZJR19GSUxFLCBjb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsICgpIHtcbiAgYXdhaXQgY2xlYW5BbGwoKTtcbiAgYXdhaXQgdXBkYXRlQ29uZmlnKCk7XG4gIGF3YWl0IGJ1aWxkQWxsKCk7XG4gIGF3YWl0IHJlbmFtZUFsbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuZWVkc0luc3RhbGwgKCkge1xuICBsb2dnZXIuZGVidWcoYENoZWNraW5nIGZvciBwcmVzZW5jZSBvZiBTYWZhcmlMYXVuY2hlciBhdCAnJHtTQUZBUklfTEFVTkNIRVJfQVBQX0ZJTEV9J2ApO1xuICBsZXQgZXhpc3RzID0gYXdhaXQgZnMuZXhpc3RzKFNBRkFSSV9MQVVOQ0hFUl9BUFBfRklMRSk7XG4gIGxvZ2dlci5kZWJ1ZyhgU2FmYXJpTGF1bmNoZXIgJHtleGlzdHMgPyAnZXhpc3RzJyA6ICdkb2VzIG5vdCBleGlzdCd9YCk7XG4gIHJldHVybiAhZXhpc3RzO1xufVxuXG5cbmV4cG9ydCB7IGluc3RhbGwsIG5lZWRzSW5zdGFsbCwgU0FGQVJJX0xBVU5DSEVSX0FQUF9GSUxFLCBTQUZBUklfTEFVTkNIRVJfQlVORExFIH07XG4iXX0=