@afelio/toolbelt
Version:
Afelio – Design Toolbelt
143 lines (123 loc) • 3.11 kB
JavaScript
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;