testcafe
Version:
Automated browser testing for the modern web development stack.
112 lines • 17.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const device_specs_1 = require("device-specs");
const lodash_1 = require("lodash");
const argument_parsing_1 = require("../../../utils/argument-parsing");
const HEADLESS_DEFAULT_WIDTH = 1280;
const HEADLESS_DEFAULT_HEIGHT = 800;
const AVAILABLE_MODES = ['userProfile', 'headless', 'emulation'];
const configCache = {};
function parseUserArgs(userArgs) {
const parsedArgs = {
headless: false,
userDataDir: false,
windowSize: false,
};
const splittedArgs = userArgs.split(' ').filter(arg => !!arg);
splittedArgs.forEach(arg => {
const keyValuePair = arg.split('=');
const key = (0, lodash_1.camelCase)(keyValuePair[0]);
parsedArgs[key] = parsedArgs[key] !== void 0;
});
return parsedArgs;
}
function parseModes(modesStr, userArgs) {
const parsed = (0, argument_parsing_1.splitEscaped)(modesStr, ':');
const path = (0, argument_parsing_1.getPathFromParsedModes)(parsed, AVAILABLE_MODES);
const detectedModes = (0, argument_parsing_1.getModes)(parsed, AVAILABLE_MODES);
let optionsString = '';
if (parsed.length)
optionsString = parsed.shift();
while (parsed.length)
optionsString += ':' + parsed.shift();
const userProfile = detectedModes.userProfile || userArgs.userDataDir;
const headless = detectedModes.headless || userArgs.headless;
const emulation = detectedModes.emulation || headless;
const modes = {
path,
userProfile,
headless,
emulation,
};
return { modes, optionsString };
}
function simplifyDeviceName(deviceName) {
return deviceName.replace(/\s/g, '').toLowerCase();
}
function findDevice(deviceName) {
const simpleName = simplifyDeviceName(deviceName);
return device_specs_1.emulatedDevices.filter(device => simplifyDeviceName(device.title).indexOf(simpleName) >= 0)[0];
}
function getDeviceBasedOptions(deviceName, orientation) {
if (!deviceName)
return {};
const deviceData = findDevice(deviceName);
if (!deviceData)
return {};
const mobile = deviceData.capabilities.indexOf('mobile') >= 0;
if (!orientation)
orientation = mobile ? 'vertical' : 'horizontal';
return {
deviceName: deviceData.title,
mobile: mobile,
orientation: orientation,
touch: deviceData.capabilities.indexOf('touch') >= 0,
width: deviceData.screen[orientation].width,
height: deviceData.screen[orientation].height,
scaleFactor: deviceData.screen['device-pixel-ratio'],
userAgent: deviceData['user-agent'],
};
}
function parseOptions(str, useDefaultDimensions) {
const parsed = (0, argument_parsing_1.splitEscaped)(str, ';');
const baseOptions = {
width: useDefaultDimensions ? HEADLESS_DEFAULT_WIDTH : 0,
height: useDefaultDimensions ? HEADLESS_DEFAULT_HEIGHT : 0,
scaleFactor: 0,
mobile: false,
cdpPort: (0, argument_parsing_1.findMatch)(parsed, /^cdpPort=(.*)/),
};
const deviceName = (0, argument_parsing_1.findMatch)(parsed, /^device=(.*)/);
const orientation = (0, argument_parsing_1.findMatch)(parsed, /^orientation=(.*)/);
const deviceBasedOptions = getDeviceBasedOptions(deviceName, orientation);
let specifiedDeviceOptions = {
orientation: orientation,
touch: (0, argument_parsing_1.hasMatch)(parsed, /^touch=/) ? (0, argument_parsing_1.isMatchTrue)(parsed, /^touch=(.*)/) : void 0,
mobile: (0, argument_parsing_1.isMatchTrue)(parsed, /^mobile=(.*)/),
width: Number((0, argument_parsing_1.findMatch)(parsed, /^width=(.*)/) || NaN),
height: Number((0, argument_parsing_1.findMatch)(parsed, /^height=(.*)/) || NaN),
scaleFactor: Number((0, argument_parsing_1.findMatch)(parsed, /^scaleFactor=(.*)/) || NaN),
userAgent: (0, argument_parsing_1.findMatch)(parsed, /^userAgent=(.*)/),
};
specifiedDeviceOptions = (0, lodash_1.pickBy)(specifiedDeviceOptions, optionValue => {
return optionValue !== void 0 && optionValue !== '' && !Number.isNaN(optionValue);
});
return Object.assign(baseOptions, deviceBasedOptions, specifiedDeviceOptions);
}
function getNewConfig(configString) {
const { userArgs, modesString } = (0, argument_parsing_1.parseConfig)(configString);
const parsedUserArgs = parseUserArgs(userArgs);
const { modes, optionsString } = parseModes(modesString, parsedUserArgs);
const useDefaultDimensions = modes.headless && !parsedUserArgs.windowSize;
const options = parseOptions(optionsString, useDefaultDimensions);
return Object.assign({ userArgs }, modes, options);
}
function default_1(configString) {
if (!configCache[configString])
configCache[configString] = getNewConfig(configString);
return configCache[configString];
}
exports.default = default_1;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Jyb3dzZXIvcHJvdmlkZXIvYnVpbHQtaW4vZGVkaWNhdGVkL2Nocm9tZS9jb25maWcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQ0FBK0M7QUFDL0MsbUNBQStEO0FBQy9ELHNFQUV5QztBQUd6QyxNQUFNLHNCQUFzQixHQUFJLElBQUksQ0FBQztBQUNyQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQyxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFakUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCLFNBQVMsYUFBYSxDQUFFLFFBQVE7SUFDNUIsTUFBTSxVQUFVLEdBQUc7UUFDZixRQUFRLEVBQUssS0FBSztRQUNsQixXQUFXLEVBQUUsS0FBSztRQUNsQixVQUFVLEVBQUcsS0FBSztLQUNyQixDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN2QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFZLElBQUEsa0JBQVMsRUFBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFFLFFBQVEs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O0FBTEQsNEJBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbXVsYXRlZERldmljZXMgfSBmcm9tICdkZXZpY2Utc3BlY3MnO1xuaW1wb3J0IHsgcGlja0J5IGFzIGZpbHRlclByb3BlcnRpZXMsIGNhbWVsQ2FzZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICAgIGhhc01hdGNoLCBmaW5kTWF0Y2gsIGlzTWF0Y2hUcnVlLCBnZXRNb2Rlcywgc3BsaXRFc2NhcGVkLCBnZXRQYXRoRnJvbVBhcnNlZE1vZGVzLCBwYXJzZUNvbmZpZyxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYXJndW1lbnQtcGFyc2luZyc7XG5cblxuY29uc3QgSEVBRExFU1NfREVGQVVMVF9XSURUSCAgPSAxMjgwO1xuY29uc3QgSEVBRExFU1NfREVGQVVMVF9IRUlHSFQgPSA4MDA7XG5cbmNvbnN0IEFWQUlMQUJMRV9NT0RFUyA9IFsndXNlclByb2ZpbGUnLCAnaGVhZGxlc3MnLCAnZW11bGF0aW9uJ107XG5cbmNvbnN0IGNvbmZpZ0NhY2hlID0ge307XG5cbmZ1bmN0aW9uIHBhcnNlVXNlckFyZ3MgKHVzZXJBcmdzKSB7XG4gICAgY29uc3QgcGFyc2VkQXJncyA9IHtcbiAgICAgICAgaGVhZGxlc3M6ICAgIGZhbHNlLFxuICAgICAgICB1c2VyRGF0YURpcjogZmFsc2UsXG4gICAgICAgIHdpbmRvd1NpemU6ICBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3BsaXR0ZWRBcmdzID0gdXNlckFyZ3Muc3BsaXQoJyAnKS5maWx0ZXIoYXJnID0+ICEhYXJnKTtcblxuICAgIHNwbGl0dGVkQXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgIGNvbnN0IGtleVZhbHVlUGFpciA9IGFyZy5zcGxpdCgnPScpO1xuICAgICAgICBjb25zdCBrZXkgICAgICAgICAgPSBjYW1lbENhc2Uoa2V5VmFsdWVQYWlyWzBdKTtcblxuICAgICAgICBwYXJzZWRBcmdzW2tleV0gPSBwYXJzZWRBcmdzW2tleV0gIT09IHZvaWQgMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJzZWRBcmdzO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vZGVzIChtb2Rlc1N0ciwgdXNlckFyZ3MpIHtcbiAgICBjb25zdCBwYXJzZWQgICAgICAgID0gc3BsaXRFc2NhcGVkKG1vZGVzU3RyLCAnOicpO1xuICAgIGNvbnN0IHBhdGggICAgICAgICAgPSBnZXRQYXRoRnJvbVBhcnNlZE1vZGVzKHBhcnNlZCwgQVZBSUxBQkxFX01PREVTKTtcbiAgICBjb25zdCBkZXRlY3RlZE1vZGVzID0gZ2V0TW9kZXMocGFyc2VkLCBBVkFJTEFCTEVfTU9ERVMpO1xuICAgIGxldCBvcHRpb25zU3RyaW5nID0gJyc7XG5cbiAgICBpZiAocGFyc2VkLmxlbmd0aClcbiAgICAgICAgb3B0aW9uc1N0cmluZyA9IHBhcnNlZC5zaGlmdCgpO1xuXG4gICAgd2hpbGUgKHBhcnNlZC5sZW5ndGgpXG4gICAgICAgIG9wdGlvbnNTdHJpbmcgKz0gJzonICsgcGFyc2VkLnNoaWZ0KCk7XG5cbiAgICBjb25zdCB1c2VyUHJvZmlsZSA9IGRldGVjdGVkTW9kZXMudXNlclByb2ZpbGUgfHwgdXNlckFyZ3MudXNlckRhdGFEaXI7XG4gICAgY29uc3QgaGVhZGxlc3MgICAgPSBkZXRlY3RlZE1vZGVzLmhlYWRsZXNzIHx8IHVzZXJBcmdzLmhlYWRsZXNzO1xuICAgIGNvbnN0IGVtdWxhdGlvbiAgID0gZGV0ZWN0ZWRNb2Rlcy5lbXVsYXRpb24gfHwgaGVhZGxlc3M7XG5cbiAgICBjb25zdCBtb2RlcyA9IHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgdXNlclByb2ZpbGUsXG4gICAgICAgIGhlYWRsZXNzLFxuICAgICAgICBlbXVsYXRpb24sXG4gICAgfTtcblxuICAgIHJldHVybiB7IG1vZGVzLCBvcHRpb25zU3RyaW5nIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsaWZ5RGV2aWNlTmFtZSAoZGV2aWNlTmFtZSkge1xuICAgIHJldHVybiBkZXZpY2VOYW1lLnJlcGxhY2UoL1xccy9nLCAnJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gZmluZERldmljZSAoZGV2aWNlTmFtZSkge1xuICAgIGNvbnN0IHNpbXBsZU5hbWUgPSBzaW1wbGlmeURldmljZU5hbWUoZGV2aWNlTmFtZSk7XG5cbiAgICByZXR1cm4gZW11bGF0ZWREZXZpY2VzLmZpbHRlcihkZXZpY2UgPT4gc2ltcGxpZnlEZXZpY2VOYW1lKGRldmljZS50aXRsZSkuaW5kZXhPZihzaW1wbGVOYW1lKSA+PSAwKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0RGV2aWNlQmFzZWRPcHRpb25zIChkZXZpY2VOYW1lLCBvcmllbnRhdGlvbikge1xuICAgIGlmICghZGV2aWNlTmFtZSlcbiAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgY29uc3QgZGV2aWNlRGF0YSA9IGZpbmREZXZpY2UoZGV2aWNlTmFtZSk7XG5cbiAgICBpZiAoIWRldmljZURhdGEpXG4gICAgICAgIHJldHVybiB7fTtcblxuICAgIGNvbnN0IG1vYmlsZSA9IGRldmljZURhdGEuY2FwYWJpbGl0aWVzLmluZGV4T2YoJ21vYmlsZScpID49IDA7XG5cbiAgICBpZiAoIW9yaWVudGF0aW9uKVxuICAgICAgICBvcmllbnRhdGlvbiA9IG1vYmlsZSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VOYW1lOiAgZGV2aWNlRGF0YS50aXRsZSxcbiAgICAgICAgbW9iaWxlOiAgICAgIG1vYmlsZSxcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgICAgICB0b3VjaDogICAgICAgZGV2aWNlRGF0YS5jYXBhYmlsaXRpZXMuaW5kZXhPZigndG91Y2gnKSA+PSAwLFxuICAgICAgICB3aWR0aDogICAgICAgZGV2aWNlRGF0YS5zY3JlZW5bb3JpZW50YXRpb25dLndpZHRoLFxuICAgICAgICBoZWlnaHQ6ICAgICAgZGV2aWNlRGF0YS5zY3JlZW5bb3JpZW50YXRpb25dLmhlaWdodCxcbiAgICAgICAgc2NhbGVGYWN0b3I6IGRldmljZURhdGEuc2NyZWVuWydkZXZpY2UtcGl4ZWwtcmF0aW8nXSxcbiAgICAgICAgdXNlckFnZW50OiAgIGRldmljZURhdGFbJ3VzZXItYWdlbnQnXSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnMgKHN0ciwgdXNlRGVmYXVsdERpbWVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBzcGxpdEVzY2FwZWQoc3RyLCAnOycpO1xuXG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSB7XG4gICAgICAgIHdpZHRoOiAgICAgICB1c2VEZWZhdWx0RGltZW5zaW9ucyA/IEhFQURMRVNTX0RFRkFVTFRfV0lEVEggOiAwLFxuICAgICAgICBoZWlnaHQ6ICAgICAgdXNlRGVmYXVsdERpbWVuc2lvbnMgPyBIRUFETEVTU19ERUZBVUxUX0hFSUdIVCA6IDAsXG4gICAgICAgIHNjYWxlRmFjdG9yOiAwLFxuICAgICAgICBtb2JpbGU6ICAgICAgZmFsc2UsXG4gICAgICAgIGNkcFBvcnQ6ICAgICBmaW5kTWF0Y2gocGFyc2VkLCAvXmNkcFBvcnQ9KC4qKS8pLFxuICAgIH07XG5cbiAgICBjb25zdCBkZXZpY2VOYW1lICAgICAgICAgPSBmaW5kTWF0Y2gocGFyc2VkLCAvXmRldmljZT0oLiopLyk7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gICAgICAgID0gZmluZE1hdGNoKHBhcnNlZCwgL15vcmllbnRhdGlvbj0oLiopLyk7XG4gICAgY29uc3QgZGV2aWNlQmFzZWRPcHRpb25zID0gZ2V0RGV2aWNlQmFzZWRPcHRpb25zKGRldmljZU5hbWUsIG9yaWVudGF0aW9uKTtcblxuICAgIGxldCBzcGVjaWZpZWREZXZpY2VPcHRpb25zID0ge1xuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb24sXG4gICAgICAgIHRvdWNoOiAgICAgICBoYXNNYXRjaChwYXJzZWQsIC9edG91Y2g9LykgPyBpc01hdGNoVHJ1ZShwYXJzZWQsIC9edG91Y2g9KC4qKS8pIDogdm9pZCAwLFxuICAgICAgICBtb2JpbGU6ICAgICAgaXNNYXRjaFRydWUocGFyc2VkLCAvXm1vYmlsZT0oLiopLyksXG4gICAgICAgIHdpZHRoOiAgICAgICBOdW1iZXIoZmluZE1hdGNoKHBhcnNlZCwgL153aWR0aD0oLiopLykgfHwgTmFOKSxcbiAgICAgICAgaGVpZ2h0OiAgICAgIE51bWJlcihmaW5kTWF0Y2gocGFyc2VkLCAvXmhlaWdodD0oLiopLykgfHwgTmFOKSxcbiAgICAgICAgc2NhbGVGYWN0b3I6IE51bWJlcihmaW5kTWF0Y2gocGFyc2VkLCAvXnNjYWxlRmFjdG9yPSguKikvKSB8fCBOYU4pLFxuICAgICAgICB1c2VyQWdlbnQ6ICAgZmluZE1hdGNoKHBhcnNlZCwgL151c2VyQWdlbnQ9KC4qKS8pLFxuICAgIH07XG5cbiAgICBzcGVjaWZpZWREZXZpY2VPcHRpb25zID0gZmlsdGVyUHJvcGVydGllcyhzcGVjaWZpZWREZXZpY2VPcHRpb25zLCBvcHRpb25WYWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZSAhPT0gdm9pZCAwICYmIG9wdGlvblZhbHVlICE9PSAnJyAmJiAhTnVtYmVyLmlzTmFOKG9wdGlvblZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGJhc2VPcHRpb25zLCBkZXZpY2VCYXNlZE9wdGlvbnMsIHNwZWNpZmllZERldmljZU9wdGlvbnMpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE5ld0NvbmZpZyAoY29uZmlnU3RyaW5nKSB7XG4gICAgY29uc3QgeyB1c2VyQXJncywgbW9kZXNTdHJpbmcgfSA9IHBhcnNlQ29uZmlnKGNvbmZpZ1N0cmluZyk7XG4gICAgY29uc3QgcGFyc2VkVXNlckFyZ3MgICAgICAgICAgICA9IHBhcnNlVXNlckFyZ3ModXNlckFyZ3MpO1xuICAgIGNvbnN0IHsgbW9kZXMsIG9wdGlvbnNTdHJpbmcgfSAgPSBwYXJzZU1vZGVzKG1vZGVzU3RyaW5nLCBwYXJzZWRVc2VyQXJncyk7XG4gICAgY29uc3QgdXNlRGVmYXVsdERpbWVuc2lvbnMgICAgICA9IG1vZGVzLmhlYWRsZXNzICYmICFwYXJzZWRVc2VyQXJncy53aW5kb3dTaXplO1xuICAgIGNvbnN0IG9wdGlvbnMgICAgICAgICAgICAgICAgICAgPSBwYXJzZU9wdGlvbnMob3B0aW9uc1N0cmluZywgdXNlRGVmYXVsdERpbWVuc2lvbnMpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB1c2VyQXJncyB9LCBtb2Rlcywgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChjb25maWdTdHJpbmcpIHtcbiAgICBpZiAoIWNvbmZpZ0NhY2hlW2NvbmZpZ1N0cmluZ10pXG4gICAgICAgIGNvbmZpZ0NhY2hlW2NvbmZpZ1N0cmluZ10gPSBnZXROZXdDb25maWcoY29uZmlnU3RyaW5nKTtcblxuICAgIHJldHVybiBjb25maWdDYWNoZVtjb25maWdTdHJpbmddO1xufVxuIl19