AK-21/Graphite-Industrial-Intelligence
0
1let browserslist = require('browserslist')2let { agents } = require('caniuse-lite/dist/unpacker/agents')3 4let utils = require('./utils')5 6class Browsers {7 constructor(data, requirements, options, browserslistOpts) {8 this.data = data9 this.options = options || {}10 this.browserslistOpts = browserslistOpts || {}11 this.selected = this.parse(requirements)12 }13 14 /**15 * Return all prefixes for default browser data16 */17 static prefixes() {18 if (this.prefixesCache) {19 return this.prefixesCache20 }21 22 this.prefixesCache = []23 for (let name in agents) {24 this.prefixesCache.push(`-${agents[name].prefix}-`)25 }26 27 this.prefixesCache = utils28 .uniq(this.prefixesCache)29 .sort((a, b) => b.length - a.length)30 31 return this.prefixesCache32 }33 34 /**35 * Check is value contain any possible prefix36 */37 static withPrefix(value) {38 if (!this.prefixesRegexp) {39 this.prefixesRegexp = new RegExp(this.prefixes().join('|'))40 }41 42 return this.prefixesRegexp.test(value)43 }44 45 /**46 * Is browser is selected by requirements47 */48 isSelected(browser) {49 return this.selected.includes(browser)50 }51 52 /**53 * Return browsers selected by requirements54 */55 parse(requirements) {56 let opts = {}57 for (let i in this.browserslistOpts) {58 opts[i] = this.browserslistOpts[i]59 }60 opts.path = this.options.from61 return browserslist(requirements, opts)62 }63 64 /**65 * Return prefix for selected browser66 */67 prefix(browser) {68 let [name, version] = browser.split(' ')69 let data = this.data[name]70 71 let prefix = data.prefix_exceptions && data.prefix_exceptions[version]72 if (!prefix) {73 prefix = data.prefix74 }75 return `-${prefix}-`76 }77}78 79module.exports = Browsers80 