wdio-sync
Version:
A WebdriverIO plugin. Helper module to run WebdriverIO commands synchronously.
1,124 lines (919 loc) • 36.5 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.__RewireAPI__ = exports.__ResetDependency__ = exports.__set__ = exports.__Rewire__ = exports.__GetDependency__ = exports.__get__ = exports.is$$ = exports.wdioSync = exports.executeAsync = exports.executeSync = exports.executeHooksWithArgs = exports.runInFiberContext = exports.wrapCommands = exports.wrapCommand = undefined;
var _defineProperty = require('babel-runtime/core-js/object/define-property');
var _defineProperty2 = _interopRequireDefault(_defineProperty);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _create = require('babel-runtime/core-js/object/create');
var _create2 = _interopRequireDefault(_create);
var _setPrototypeOf = require('babel-runtime/core-js/object/set-prototype-of');
var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _future = require('fibers/future');
var _future2 = _interopRequireDefault(_future);
var _object = require('object.assign');
var _object2 = _interopRequireDefault(_object);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Fiber = require('fibers'); // ToDo fix unit test to work with imports
var SYNC_COMMANDS = ['domain', '_events', '_maxListeners', 'setMaxListeners', 'emit', 'addListener', 'on', 'once', 'removeListener', 'removeAllListeners', 'listeners', 'getMaxListeners', 'listenerCount', 'getPrototype'];
var STACKTRACE_FILTER = /((wdio-sync\/)*(build\/index.js|node_modules\/fibers)|- - - - -)/g;
var STACKTRACE_FILTER_FN = function STACKTRACE_FILTER_FN(e) {
return !e.match(_get__('STACKTRACE_FILTER'));
};
var commandIsRunning = false;
var forcePromises = false;
/**
* helpers
*/
var isAsync = function isAsync() {
if (!global.browser || !global.browser.options) {
return true;
}
return global.browser.options.sync === false;
};
var isElements = function isElements(result) {
return typeof result.selector === 'string' && Array.isArray(result.value) && result.value.length && typeof result.value[0].ELEMENT !== 'undefined';
};
var is$$ = function is$$(result) {
return Array.isArray(result) && !!result.length && !!result[0] && result[0].ELEMENT !== undefined;
};
var sanitizeErrorMessage = function sanitizeErrorMessage(e) {
var stack = e.stack.split(/\n/g);
var errorMsg = stack.shift();
var cwd = process.cwd();
/**
* filter out stack traces to wdio-sync and fibers
* and transform absolute path to relative
*/
stack = stack.filter(_get__('STACKTRACE_FILTER_FN'));
stack = stack.map(function (e) {
return ' ' + e.replace(cwd + '/', '').trim();
});
/**
* error stack can be empty when test execution is aborted and
* the application is not running
*/
var errorLine = 'unknown error line';
if (stack && stack.length) {
errorLine = stack.shift().trim();
}
/**
* correct error occurence
*/
var lineToFix = stack[stack.length - 1];
if (lineToFix && lineToFix.indexOf('index.js') > -1) {
stack[stack.length - 1] = lineToFix.slice(0, lineToFix.indexOf('index.js')) + errorLine;
} else {
stack.unshift(' ' + errorLine);
}
/**
* add back error message
*/
stack.unshift(errorMsg);
return stack.join('\n');
};
// filter out arguments passed to specFn & hookFn, don't allow callbacks
// as there is no need for user to call e.g. `done()`
var filterSpecArgs = function filterSpecArgs(args) {
return args.filter(function (arg) {
return typeof arg !== 'function';
});
};
/**
* Helper method to execute a row of hooks with certain parameters.
* It will return with a reject promise due to a design decision to not let hooks/service intefer the
* actual test process.
*
* @param {Function|Function[]} hooks list of hooks
* @param {Object[]} args list of parameter for hook functions
* @return {Promise} promise that gets resolved once all hooks finished running
*/
var executeHooksWithArgs = function executeHooksWithArgs() {
var hooks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var args = arguments[1];
/**
* make sure hooks are an array of functions
*/
if (typeof hooks === 'function') {
hooks = [hooks];
}
/**
* make sure args is an array since we are calling apply
*/
if (!Array.isArray(args)) {
args = [args];
}
hooks = hooks.map(function (hook) {
return new _promise2.default(function (resolve) {
var _commandIsRunning = _get__('commandIsRunning');
var result = void 0;
var execHook = function execHook() {
_assign__('commandIsRunning', true);
try {
result = hook.apply(null, args);
} catch (e) {
console.error(e.stack);
return resolve(e);
} finally {
_assign__('commandIsRunning', _commandIsRunning);
}
if (result && typeof result.then === 'function') {
return result.then(resolve, function (e) {
console.error(e.stack);
resolve(e);
});
}
resolve(result);
};
/**
* no need for fiber wrap in async mode
*/
if (_get__('isAsync')()) {
return execHook();
}
/**
* after command hooks require additional Fiber environment
*/
return _get__('Fiber')(execHook).run();
});
});
return _promise2.default.all(hooks);
};
/**
* global function to wrap callbacks into Fiber context
* @param {Function} fn function to wrap around
* @return {Function} wrapped around function
*/
var wdioSync = global.wdioSync = function (fn, done) {
return function () {
var _this = this;
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _get__('Fiber')(function () {
var result = fn.apply(_this, args);
if (typeof done === 'function') {
done(result);
}
}).run();
};
};
/**
* wraps a function into a Fiber ready context to enable sync execution and hooks
* @param {Function} fn function to be executed
* @param {String} commandName name of that function
* @param {Function[]} beforeCommand method to be executed before calling the actual function
* @param {Function[]} afterCommand method to be executed after calling the actual function
* @return {Function} actual wrapped function
*/
var wrapCommand = function wrapCommand(fn, commandName, beforeCommand, afterCommand) {
if (_get__('isAsync')()) {
/**
* async command wrap
*/
return function () {
for (var _len2 = arguments.length, commandArgs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
commandArgs[_key2] = arguments[_key2];
}
return fn.apply(this, commandArgs);
};
}
/**
* sync command wrap
*/
return function () {
var _this2 = this;
for (var _len3 = arguments.length, commandArgs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
commandArgs[_key3] = arguments[_key3];
}
var future = new (_get__('Future'))();
var futureFailed = false;
if (_get__('forcePromises')) {
return fn.apply(this, commandArgs);
}
/**
* don't execute [before/after]Command hook if a command was executed
* in these hooks (otherwise we will get into an endless loop)
*/
if (_get__('commandIsRunning')) {
var commandPromise = fn.apply(this, commandArgs);
/**
* if commandPromise is actually not a promise just return result
*/
if (typeof commandPromise.then !== 'function') {
return commandPromise;
}
/**
* Try to execute with Fibers and fall back if can't.
* This part is executed when we want to set a fiber context within a command (e.g. in waitUntil).
*/
try {
commandPromise.then(function (commandResult) {
/**
* extend protoype of result so people can call browser.element(...).click()
*/
future.return(_get__('applyPrototype').call(_this2, commandResult));
}, future.throw.bind(future));
return future.wait();
} catch (e) {
if (e.message === "Can't wait without a fiber") {
return commandPromise;
}
throw e;
}
}
/**
* commands that get executed during waitUntil and debug (repl mode) should always
* handled synchronously, therefor prevent propagating lastResults between single calls
*/
if (commandName !== 'waitUntil' && commandName !== 'debug') {
_assign__('commandIsRunning', true);
}
var newInstance = this;
var lastCommandResult = this.lastResult;
var commandResult = void 0,
commandError = void 0;
_get__('executeHooksWithArgs')(beforeCommand, [commandName, commandArgs]).then(function () {
/**
* actual function was already executed in desired catch block
*/
if (futureFailed) {
return;
}
newInstance = fn.apply(_this2, commandArgs);
return newInstance.then(function (result) {
commandResult = result;
return _get__('executeHooksWithArgs')(afterCommand, [commandName, commandArgs, result]);
}, function (e) {
commandError = e;
return _get__('executeHooksWithArgs')(afterCommand, [commandName, commandArgs, null, e]);
}).then(function () {
_assign__('commandIsRunning', false);
if (commandError) {
return future.throw(commandError);
}
_get__('wrapCommands')(newInstance, beforeCommand, afterCommand);
/**
* don't modify call result prototype
*/
if (commandName === 'call' || commandName === 'reload') {
return future.return(commandResult);
}
/**
* reset lastResult for all element calls within waitUntil/waitFor commands
*/
if (commandName.match(/^(waitUntil|waitFor)/i)) {
_this2.lastResult = lastCommandResult;
}
return future.return(_get__('applyPrototype').call(newInstance, commandResult));
});
});
/**
* try to execute with Fibers and fall back if can't
*/
try {
return future.wait();
} catch (e) {
if (e.message === "Can't wait without a fiber") {
futureFailed = true;
return fn.apply(this, commandArgs);
}
e.stack = _get__('sanitizeErrorMessage')(e);
throw e;
}
};
};
/**
* enhance result with instance prototype to enable command chaining
* @param {Object} result command result
* @param {Object} helperScope instance scope with prototype of already wrapped commands
* @return {Object} command result with enhanced prototype
*/
var applyPrototype = function applyPrototype(result, helperScope) {
var _this3 = this;
/**
* don't overload result for none objects, arrays and buffer
*/
if (!result || typeof result !== 'object' || Array.isArray(result) && !_get__('isElements')(result) && !_get__('is$$')(result) || Buffer.isBuffer(result)) {
return result;
}
var mapPrototype = function mapPrototype(el) {
var newInstance = (0, _setPrototypeOf2.default)((0, _create2.default)(el), (0, _getPrototypeOf2.default)(_this3));
return _get__('applyPrototype').call(newInstance, el, _this3);
};
/**
* overload elements results
*/
if (_get__('isElements')(result)) {
result.value = result.value.map(function (el, i) {
el.selector = result.selector;
el.value = { ELEMENT: el.ELEMENT };
el.index = i;
return el;
}).map(mapPrototype);
}
/**
* overload $$ result
*/
if (_get__('is$$')(result)) {
return result.map(mapPrototype);
}
var prototype = {};
var hasExtendedPrototype = false;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)((0, _getPrototypeOf2.default)(this))), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var commandName = _step.value;
if (result[commandName] || _get__('SYNC_COMMANDS').indexOf(commandName) > -1) {
continue;
}
this.lastResult = result;
/**
* Prefer the helperScope if given which is only the case when we overload elements result.
* We can't use the `this` prototype because its methods are not wrapped and command results
* wouldn't be fiberised
*/
prototype[commandName] = { value: (helperScope || this)[commandName].bind(this) };
hasExtendedPrototype = true;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
if (hasExtendedPrototype) {
var newResult = (0, _create2.default)(result, prototype);
/**
* since status is a command we need to rename the property
*/
if (typeof result.status !== 'undefined') {
result._status = result.status;
delete result.status;
}
result = _get__('assign')(newResult, result);
}
return result;
};
/**
* wraps all WebdriverIO commands
* @param {Object} instance WebdriverIO client instance (browser)
* @param {Function[]} beforeCommand before command hook
* @param {Function[]} afterCommand after command hook
*/
var wrapCommands = function wrapCommands(instance, beforeCommand, afterCommand) {
var addCommand = instance.addCommand;
/**
* if instance is a multibrowser instance make sure to wrap commands
* of its instances too
*/
if (instance.isMultiremote) {
instance.getInstances().forEach(function (browserName) {
_get__('wrapCommands')(global[browserName], beforeCommand, afterCommand);
});
}
(0, _keys2.default)((0, _getPrototypeOf2.default)(instance)).forEach(function (commandName) {
if (_get__('SYNC_COMMANDS').indexOf(commandName) > -1) {
return;
}
var origFn = instance[commandName];
instance[commandName] = _get__('wrapCommand').call(instance, origFn, commandName, beforeCommand, afterCommand);
});
/**
* no need to overwrite addCommand in async mode
*/
if (_get__('isAsync')()) {
return;
}
/**
* Adding a command within fiber context doesn't require a special routine
* since everything runs sync. There is no need to promisify the command.
*/
instance.addCommand = function (fnName, fn, forceOverwrite) {
var commandGroup = instance.getPrototype();
var commandName = fnName;
var namespace = void 0;
if (typeof fn === 'string') {
namespace = arguments[0];
fnName = arguments[1];
fn = arguments[2];
forceOverwrite = arguments[3];
switch (typeof commandGroup[namespace]) {
case 'function':
throw new Error(`Command namespace "${namespace}" is used internally, and can't be overwritten!`);
case 'undefined':
commandGroup[namespace] = {};
break;
}
commandName = `${namespace}.${fnName}`;
commandGroup = commandGroup[namespace];
}
if (commandGroup[fnName] && !forceOverwrite) {
throw new Error(`Command ${fnName} is already defined!`);
}
/**
* If method name is async the user specifies that he wants to use bare promises to handle asynchronicity.
* First use native addCommand in order to be able to chain with other native commands, then wrap new
* command again to run it synchronous in the test method.
* This will allow us to run async custom commands within sync custom commands in a sync way.
*/
if (fn.name === 'async') {
addCommand(fnName, function () {
var state = _get__('forcePromises');
_assign__('forcePromises', true);
for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
args[_key4] = arguments[_key4];
}
var res = fn.apply(instance, args);
_assign__('forcePromises', state);
return res;
}, forceOverwrite);
commandGroup[fnName] = _get__('wrapCommand').call(commandGroup, commandGroup[fnName], fnName, beforeCommand, afterCommand);
return;
}
/**
* for all other cases we internally return a promise that is
* finished once the Fiber wrapped custom function has finished
* #functionalProgrammingWTF!
*/
commandGroup[fnName] = function () {
var _this4 = this;
for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
args[_key5] = arguments[_key5];
}
return new _promise2.default(function (resolve) {
var state = _get__('forcePromises');
_assign__('forcePromises', false);
_get__('wdioSync')(fn, resolve).apply(_this4, args);
_assign__('forcePromises', state);
});
};
instance[fnName] = _get__('wrapCommand').call(commandGroup, commandGroup[fnName], commandName, beforeCommand, afterCommand);
};
};
/**
* execute test or hook synchronously
* @param {Function} fn spec or hook method
* @param {Number} repeatTest number of retries
* @return {Promise} that gets resolved once test/hook is done or was retried enough
*/
var executeSync = function executeSync(fn) {
var _this5 = this;
var repeatTest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
/**
* if a new hook gets executed we can assume that all commands should have finised
* with exception of timeouts where `commandIsRunning` will never be reset but here
*/
_assign__('commandIsRunning', false);
return new _promise2.default(function (resolve, reject) {
try {
var res = fn.apply(_this5, args);
resolve(res);
} catch (e) {
if (repeatTest) {
return resolve(_get__('executeSync')(fn, --repeatTest, args));
}
/**
* no need to modify stack if no stack available
*/
if (!e.stack) {
return reject(e);
}
e.stack = e.stack.split('\n').filter(_get__('STACKTRACE_FILTER_FN')).join('\n');
reject(e);
}
});
};
/**
* execute test or hook asynchronously
* @param {Function} fn spec or hook method
* @param {Number} repeatTest number of retries
* @return {Promise} that gets resolved once test/hook is done or was retried enough
*/
var executeAsync = function executeAsync(fn) {
var repeatTest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var result = void 0,
error = void 0;
/**
* if a new hook gets executed we can assume that all commands should have finised
* with exception of timeouts where `commandIsRunning` will never be reset but here
*/
_assign__('commandIsRunning', false);
try {
result = fn.apply(this, args);
} catch (e) {
error = e;
}
/**
* handle errors that get thrown directly and are not cause by
* rejected promises
*/
if (error) {
if (repeatTest) {
return _get__('executeAsync')(fn, --repeatTest, args);
}
return new _promise2.default(function (resolve, reject) {
return reject(error);
});
}
/**
* if we don't retry just return result
*/
if (repeatTest === 0 || !result || typeof result.catch !== 'function') {
return new _promise2.default(function (resolve) {
return resolve(result);
});
}
/**
* handle promise response
*/
return result.catch(function (e) {
if (repeatTest) {
return _get__('executeAsync')(fn, --repeatTest, args);
}
e.stack = e.stack.split('\n').filter(_get__('STACKTRACE_FILTER_FN')).join('\n');
return _promise2.default.reject(e);
});
};
/**
* runs a hook within fibers context (if function name is not async)
* it also executes before/after hook hook
*
* @param {Function} hookFn function that was passed to the framework hook
* @param {Function} origFn original framework hook function
* @param {Function} before before hook hook
* @param {Function} after after hook hook
* @param {Number} repeatTest number of retries if hook fails
* @return {Function} wrapped framework hook function
*/
var runHook = function runHook(hookFn, origFn, before, after) {
var repeatTest = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
var hookError = function hookError(hookName) {
return function (e) {
return console.error(`Error in ${hookName}: ${e.stack}`);
};
};
return origFn(function () {
var _this6 = this;
for (var _len6 = arguments.length, hookArgs = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
hookArgs[_key6] = arguments[_key6];
}
// Print errors encountered in beforeHook and afterHook to console, but
// don't propagate them to avoid failing the test. However, errors in
// framework hook functions should fail the test, so propagate those.
return _get__('executeHooksWithArgs')(before).catch(hookError('beforeHook')).then(function () {
/**
* user wants handle async command using promises, no need to wrap in fiber context
*/
if (_get__('isAsync')() || hookFn.name === 'async') {
return _get__('executeAsync').call(_this6, hookFn, repeatTest, _get__('filterSpecArgs')(hookArgs));
}
return new _promise2.default(_get__('runSync').call(_this6, hookFn, repeatTest, _get__('filterSpecArgs')(hookArgs)));
}).then(function () {
return _get__('executeHooksWithArgs')(after).catch(hookError('afterHook'));
});
});
};
/**
* runs a spec function (test function) within the fibers context
* @param {string} specTitle test description
* @param {Function} specFn test function that got passed in from the user
* @param {Function} origFn original framework test function
* @param {Number} repeatTest number of retries if test fails
* @return {Function} wrapped test function
*/
var runSpec = function runSpec(specTitle, specFn, origFn) {
var repeatTest = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
/**
* user wants handle async command using promises, no need to wrap in fiber context
*/
if (_get__('isAsync')() || specFn.name === 'async') {
return origFn(specTitle, function async() {
for (var _len7 = arguments.length, specArgs = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
specArgs[_key7] = arguments[_key7];
}
return _get__('executeAsync').call(this, specFn, repeatTest, _get__('filterSpecArgs')(specArgs));
});
}
return origFn(specTitle, function () {
for (var _len8 = arguments.length, specArgs = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
specArgs[_key8] = arguments[_key8];
}
return new _promise2.default(_get__('runSync').call(this, specFn, repeatTest, _get__('filterSpecArgs')(specArgs)));
});
};
/**
* run hook or spec via executeSync
*/
function runSync(fn) {
var _this7 = this;
var repeatTest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
return function (resolve, reject) {
return _get__('Fiber')(function () {
return _get__('executeSync').call(_this7, fn, repeatTest, args).then(function () {
return resolve();
}, reject);
}).run();
};
}
/**
* wraps hooks and test function of a framework within a fiber context
* @param {Function} origFn original framework function
* @param {string[]} testInterfaceFnNames actual test functions for that framework
* @return {Function} wrapped test/hook function
*/
var wrapTestFunction = function wrapTestFunction(fnName, origFn, testInterfaceFnNames, before, after) {
return function () {
for (var _len9 = arguments.length, specArguments = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
specArguments[_key9] = arguments[_key9];
}
/**
* Variadic arguments:
* [title, fn], [title], [fn]
* [title, fn, retryCnt], [title, retryCnt], [fn, retryCnt]
*/
var retryCnt = typeof specArguments[specArguments.length - 1] === 'number' ? specArguments.pop() : 0;
var specFn = typeof specArguments[0] === 'function' ? specArguments.shift() : typeof specArguments[1] === 'function' ? specArguments.pop() : undefined;
var specTitle = specArguments[0];
if (testInterfaceFnNames.indexOf(fnName) > -1) {
if (specFn) return _get__('runSpec')(specTitle, specFn, origFn, retryCnt);
/**
* if specFn is undefined we are dealing with a pending function
*/
return origFn(specTitle);
}
return _get__('runHook')(specFn, origFn, before, after, retryCnt);
};
};
/**
* Wraps global test function like `it` so that commands can run synchronouse
*
* The scope parameter is used in the qunit framework since all functions are bound to global.QUnit instead of global
*
* @param {String[]} testInterfaceFnNames command that runs specs
* @param {Function} before before hook hook
* @param {Function} after after hook hook
* @param {String} fnName test interface command to wrap
* @param {Object} scope the scope to run command from, defaults to global
*/
var runInFiberContext = function runInFiberContext(testInterfaceFnNames, before, after, fnName) {
var scope = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : global;
var origFn = scope[fnName];
scope[fnName] = _get__('wrapTestFunction')(fnName, origFn, testInterfaceFnNames, before, after);
/**
* support it.skip for the Mocha framework
*/
if (typeof origFn.skip === 'function') {
scope[fnName].skip = origFn.skip;
}
/**
* wrap it.only for the Mocha framework
*/
if (typeof origFn.only === 'function') {
var origOnlyFn = origFn.only;
scope[fnName].only = _get__('wrapTestFunction')(fnName + '.only', origOnlyFn, testInterfaceFnNames, before, after);
}
};
exports.wrapCommand = wrapCommand;
exports.wrapCommands = wrapCommands;
exports.runInFiberContext = runInFiberContext;
exports.executeHooksWithArgs = executeHooksWithArgs;
exports.executeSync = executeSync;
exports.executeAsync = executeAsync;
exports.wdioSync = wdioSync;
exports.is$$ = is$$;
function _getGlobalObject() {
try {
if (!!global) {
return global;
}
} catch (e) {
try {
if (!!window) {
return window;
}
} catch (e) {
return this;
}
}
}
;
var _RewireModuleId__ = null;
function _getRewireModuleId__() {
if (_RewireModuleId__ === null) {
var globalVariable = _getGlobalObject();
if (!globalVariable.__$$GLOBAL_REWIRE_NEXT_MODULE_ID__) {
globalVariable.__$$GLOBAL_REWIRE_NEXT_MODULE_ID__ = 0;
}
_RewireModuleId__ = __$$GLOBAL_REWIRE_NEXT_MODULE_ID__++;
}
return _RewireModuleId__;
}
function _getRewireRegistry__() {
var theGlobalVariable = _getGlobalObject();
if (!theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__) {
theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__ = (0, _create2.default)(null);
}
return __$$GLOBAL_REWIRE_REGISTRY__;
}
function _getRewiredData__() {
var moduleId = _getRewireModuleId__();
var registry = _getRewireRegistry__();
var rewireData = registry[moduleId];
if (!rewireData) {
registry[moduleId] = (0, _create2.default)(null);
rewireData = registry[moduleId];
}
return rewireData;
}
(function registerResetAll() {
var theGlobalVariable = _getGlobalObject();
if (!theGlobalVariable['__rewire_reset_all__']) {
theGlobalVariable['__rewire_reset_all__'] = function () {
theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__ = (0, _create2.default)(null);
};
}
})();
var INTENTIONAL_UNDEFINED = '__INTENTIONAL_UNDEFINED__';
var _RewireAPI__ = {};
(function () {
function addPropertyToAPIObject(name, value) {
(0, _defineProperty2.default)(_RewireAPI__, name, {
value: value,
enumerable: false,
configurable: true
});
}
addPropertyToAPIObject('__get__', _get__);
addPropertyToAPIObject('__GetDependency__', _get__);
addPropertyToAPIObject('__Rewire__', _set__);
addPropertyToAPIObject('__set__', _set__);
addPropertyToAPIObject('__reset__', _reset__);
addPropertyToAPIObject('__ResetDependency__', _reset__);
addPropertyToAPIObject('__with__', _with__);
})();
function _get__(variableName) {
var rewireData = _getRewiredData__();
if (rewireData[variableName] === undefined) {
return _get_original__(variableName);
} else {
var value = rewireData[variableName];
if (value === INTENTIONAL_UNDEFINED) {
return undefined;
} else {
return value;
}
}
}
function _get_original__(variableName) {
switch (variableName) {
case 'STACKTRACE_FILTER':
return STACKTRACE_FILTER;
case 'STACKTRACE_FILTER_FN':
return STACKTRACE_FILTER_FN;
case 'commandIsRunning':
return commandIsRunning;
case 'isAsync':
return isAsync;
case 'Fiber':
return Fiber;
case 'Future':
return _future2.default;
case 'forcePromises':
return forcePromises;
case 'applyPrototype':
return applyPrototype;
case 'executeHooksWithArgs':
return executeHooksWithArgs;
case 'wrapCommands':
return wrapCommands;
case 'sanitizeErrorMessage':
return sanitizeErrorMessage;
case 'isElements':
return isElements;
case 'is$$':
return is$$;
case 'SYNC_COMMANDS':
return SYNC_COMMANDS;
case 'assign':
return _object2.default;
case 'wrapCommand':
return wrapCommand;
case 'wdioSync':
return wdioSync;
case 'executeSync':
return executeSync;
case 'executeAsync':
return executeAsync;
case 'filterSpecArgs':
return filterSpecArgs;
case 'runSync':
return runSync;
case 'runSpec':
return runSpec;
case 'runHook':
return runHook;
case 'wrapTestFunction':
return wrapTestFunction;
}
return undefined;
}
function _assign__(variableName, value) {
var rewireData = _getRewiredData__();
if (rewireData[variableName] === undefined) {
return _set_original__(variableName, value);
} else {
return rewireData[variableName] = value;
}
}
function _set_original__(variableName, _value) {
switch (variableName) {
case 'commandIsRunning':
return commandIsRunning = _value;
case 'forcePromises':
return forcePromises = _value;
}
return undefined;
}
function _update_operation__(operation, variableName, prefix) {
var oldValue = _get__(variableName);
var newValue = operation === '++' ? oldValue + 1 : oldValue - 1;
_assign__(variableName, newValue);
return prefix ? newValue : oldValue;
}
function _set__(variableName, value) {
var rewireData = _getRewiredData__();
if (typeof variableName === 'object') {
(0, _keys2.default)(variableName).forEach(function (name) {
rewireData[name] = variableName[name];
});
} else {
if (value === undefined) {
rewireData[variableName] = INTENTIONAL_UNDEFINED;
} else {
rewireData[variableName] = value;
}
return function () {
_reset__(variableName);
};
}
}
function _reset__(variableName) {
var rewireData = _getRewiredData__();
delete rewireData[variableName];
if ((0, _keys2.default)(rewireData).length == 0) {
delete _getRewireRegistry__()[_getRewireModuleId__];
}
;
}
function _with__(object) {
var rewireData = _getRewiredData__();
var rewiredVariableNames = (0, _keys2.default)(object);
var previousValues = {};
function reset() {
rewiredVariableNames.forEach(function (variableName) {
rewireData[variableName] = previousValues[variableName];
});
}
return function (callback) {
rewiredVariableNames.forEach(function (variableName) {
previousValues[variableName] = rewireData[variableName];
rewireData[variableName] = object[variableName];
});
var result = callback();
if (!!result && typeof result.then == 'function') {
result.then(reset).catch(reset);
} else {
reset();
}
return result;
};
}
exports.__get__ = _get__;
exports.__GetDependency__ = _get__;
exports.__Rewire__ = _set__;
exports.__set__ = _set__;
exports.__ResetDependency__ = _reset__;
exports.__RewireAPI__ = _RewireAPI__;
exports.default = _RewireAPI__;
;