UNPKG

gesalakacula

Version:

Generate SauceLabs Karma Custom Launchers --- aka --- Ge-Sa-La-Ka-Cu-La-aaaaa

118 lines (104 loc) 3.13 kB
'use strict'; var SAUCELABS_BASE = 'SauceLabs'; var SAUCELABS_PREFIX = 'SL'; var RANGE_REGEX = /(\d+)..(\d+)/; var processBrowsers = queueLauncherKey('browserName', processLauncherRange); var processPlatform = queueLauncherKey('platform', processBrowsers); // The "geSaLaKaCuLa" magic spell !! geSaLaKaCuLaaaaaaaa :D module.exports = generateSauceLabsKarmaCustomLaunchers; // The "reKaLa" magic spell !! reKaLaaaaaaaaaaaaaaaaaaaa :D module.exports.recursiveKarmaLauncher = require('./reKaLa'); //// /** * Generate the launcher range. * @param {String|Array} range the explicit range to cover (or abstract string) * can be formed like [0,1,2,3] or '0...3' * @returns {Array} Array of launcher */ function processLauncherRange(range) { if (typeof range === 'string') { range = range .split(',') .map(function(rangePart){ rangePart = rangePart.trim(); if (!rangePart){ return []; } if (!RANGE_REGEX.test(rangePart)){ return [rangePart]; } var limits = range.match(RANGE_REGEX); var min = +limits[1], max = +limits[2]; var delta = max - min; return Array .apply(null, { length: delta + 1 }) .map(function (v, i) { return min + i; }); }) .reduce(function (a, b) { // flatten return a.concat(b); }, []); } if (!Array.isArray(range)){ range = []; } return range.map(function (version) { return { // default base: SAUCELABS_BASE, version: '' + version }; }); } /** * Generic in queue key assignment. * @description * This will assign the in the result fo a sub process. * @param {String} asKey the name to use in the launcher environment * for the current key in the target. * @param {Function} subprocess process to use as launcher environment * @returns {Function} A target processor. */ function queueLauncherKey(asKey, subprocess) { return function processTarget(targets) { return Object .keys(targets) .map(function (targetName) { return subprocess(targets[targetName]) .map(function (launcher) { launcher[asKey] = targetName; return launcher; }); }) .reduce(function (a, b) { // flatten return a.concat(b); }, []); }; } /** * Generate SauceLabs Karma "customLaunchers". * @param {Object} config The abstract full config to process * @returns {Object} The karma ready "customLaunchers" object. */ function generateSauceLabsKarmaCustomLaunchers(config) { return processPlatform(config) .reduce(function (memo, launcher) { var launcherName = [ SAUCELABS_PREFIX, shorty(launcher.platform), shorty(launcher.browserName), launcher.version ].join('_'); memo[launcherName] = launcher; return memo; }, {}); //// function shorty(str) { return str.indexOf(' ') === -1 ? // capitaliseFirstLetter str.charAt(0).toUpperCase() + str.slice(1) : // abbr str.match(/\b(\w)/g).join('').toUpperCase(); } }