UNPKG

@afelio/toolbelt

Version:

Afelio – Design Toolbelt

143 lines (123 loc) 3.11 kB
const superagent = require('superagent'); const _ = require('underscore'); const inquirer = require('inquirer'); /** * Browsers collection supported by the screenshots API * All the data comes from Browserstack * * @author Alexandre Masy <hello@alexandremasy.com> **/ class Browsers { constructor() { this._plateforms = null; } /** * Return the list of choices * * @param {Array} actives **/ async getListOfChoices( actives ) { let ret = []; let os = await this.getOs(); let browsers; let max = 3; await os.forEach( async (e) => { browsers = await this.getBrowsers(e.os, e.os_version); ret.push (new inquirer.Separator(e.name)); browsers = _.groupBy(browsers, 'browser'); browsers = _.sortBy(browsers, 'browser_version'); browsers.forEach( async (f) => { let versions = f.reverse().slice(0, max); versions.forEach( async (g) => { let active = false; actives.forEach( (f) => { active = (g.os == f.os && g.os_version == f.os_version && g.browser == f.browser && g.browser_version == f.browser_version); }); ret.push({'name':g.name, 'value': g, 'checked': active}); }); }); }); return ret; } /** * Get the list of plateforms available * * @return {Promise} The promise of a collection **/ async getPlateforms() { if (this._plateforms) { return this._plateforms; } else { let url = 'https://www.browserstack.com/screenshots/browsers.json'; let data = await superagent.get(url); this._plateforms = data.body; return this.getPlateforms(); } } /** * Return the list of os available * * @return {String} value * @return {Array} **/ async getOs(value) { let names = []; let ret = []; let data = await this.getPlateforms(); data.forEach( e => { // console.log(e); let n = `${e.os} ${e.os_version}`; if (value != null && value != n) return; if (!names.includes(n)) { names.push(n); ret.push({'name': n, 'os': e.os, 'os_version':e.os_version}); } } ); return ret; } /** * Return the list of browsers available for an os and its version * * @param {String} os * @param {String} os_version * @return {Array} **/ async getBrowsers(os, os_version) { let names = []; let ret = []; let data = await this.getPlateforms(); data.forEach( e => { let n = `${e.browser} ${e.browser_version}`; if (e.os == os && e.os_version == os_version && e.browser_version != null && !names.includes(n) ) { names.push(n); ret.push({ 'name': n, 'os': os, 'os_version': os_version, 'browser': e.browser, 'browser_version': e.browser_version }); } }); return ret; } } module.exports = Browsers;