browserslist = function (queries, opts) { if ( typeof opts === 'undefined' ) opts = { }; if ( !opts.hasOwnProperty('path') ) { opts.path = path.resolve('.'); } if ( typeof queries === 'undefined' || queries === null ) { if ( process.env.BROWSERSLIST ) { queries = process.env.BROWSERSLIST; } else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) { var file = opts.config || process.env.BROWSERSLIST_CONFIG; queries = pickEnv(browserslist.readConfig(file), opts); } else if ( opts.path ) { queries = pickEnv(browserslist.findConfig(opts.path), opts); } } if ( typeof queries === 'undefined' || queries === null ) { queries = browserslist.defaults; } if ( typeof queries === 'string' ) { queries = queries.split(/,\s*/); } var context = { }; var stats = getStat(opts); if ( stats ) { if ( typeof stats === 'string' ) { try { stats = JSON.parse(fs.readFileSync(stats)); } catch (e) { error('Can\'t read ' + stats); } } if ( 'dataByBrowser' in stats ) { stats = stats.dataByBrowser; } context.customUsage = { }; for ( var browser in stats ) { fillUsage(context.customUsage, browser, stats[browser]); } } var result = []; queries.forEach(function (selection) { if ( selection.trim() === '' ) return; var exclude = selection.indexOf('not ') === 0; if ( exclude ) selection = selection.slice(4); for ( var i in browserslist.queries ) { var type = browserslist.queries[i]; var match = selection.match(type.regexp); if ( match ) { var args = [context].concat(match.slice(1)); var array = type.select.apply(browserslist, args); if ( exclude ) { array = array.concat(array.map(function (j) { return j.replace(/\s\d+/, ' 0'); })); result = result.filter(function (j) { return array.indexOf(j) === -1; }); } else { result = result.concat(array); } return; } } error('Unknown browser query `' + selection + '`'); }); result = result.map(function (i) { var parts = i.split(' '); var name = parts[0]; var version = parts[1]; if ( version === '0' ) { return name + ' ' + browserslist.byName(name).versions[0]; } else { return i; } }).sort(function (name1, name2) { name1 = name1.split(' '); name2 = name2.split(' '); if ( name1[0] === name2[0] ) { if ( FLOAT_RANGE.test(name1[1]) && FLOAT_RANGE.test(name2[1]) ) { return parseFloat(name2[1]) - parseFloat(name1[1]); } else { return compareStrings(name2[1], name1[1]); } } else { return compareStrings(name1[0], name2[0]); } }); return uniq(result); }
n/a
byName = function (name) { name = name.toLowerCase(); name = browserslist.aliases[name] || name; return browserslist.data[name]; }
...
error('Unknown browser query `' + selection + '`');
});
result = result.map(function (i) {
var parts = i.split(' ');
var name = parts[0];
var version = parts[1];
if ( version === '0' ) {
return name + ' ' + browserslist.byName(name).versions[0];
} else {
return i;
}
}).sort(function (name1, name2) {
name1 = name1.split(' ');
name2 = name2.split(' ');
if ( name1[0] === name2[0] ) {
...
checkName = function (name) { var data = browserslist.byName(name); if ( !data ) error('Unknown browser ' + name); return data; }
...
return selected;
}
},
lastByBrowser: {
regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i,
select: function (context, versions, name) {
var data = browserslist.checkName(name);
return data.released.slice(-versions).map(function (v) {
return data.name + ' ' + v;
});
}
},
globalStatistics: {
...
clearCaches = function () { filenessCache = {}; configCache = {}; }
...
Browserslist caches the configuration it reads from `package.json` and
`browserslist` files, as well as knowledge about the existence of files,
for the duration of the hosting process.
To clear these caches, use:
```js
browserslist.clearCaches();
```
To disable the caching altogether, set the `BROWSERSLIST_DISABLE_CACHE`
environment variable.
...
coverage = function (browsers, country) { if ( country && country !== 'global' ) { country = country.toUpperCase(); loadCountryStatistics(country); } else { country = 'global'; } return browsers.reduce(function (all, i) { var usage = browserslist.usage[country][i]; if ( usage === undefined ) { usage = browserslist.usage[country][i.replace(/ [\d.]+$/, ' 0')]; } return all + (usage || 0); }, 0); }
...
## 1.3.1
* Add Safari TP support.
## 1.3
* Add coverage for specific country (by Joshua Wise).
## 1.2
* Add `browserslist.coverage()` method.
* Add `--coverage` and `-c` argument to CLI.
* Add `-v` argument support to CLI.
* Better error handling in CLI.
## 1.1.3
* Fix jspm support (by Sean Anderson).
...
findConfig = function (from) { from = path.resolve(from); var cacheKey = isFile(from) ? path.dirname(from) : from; if ( cacheKey in configCache ) { return configCache[cacheKey]; } var resolved = eachParent(from, function (dir) { var config = path.join(dir, 'browserslist'); var pkg = path.join(dir, 'package.json'); var rc = path.join(dir, '.browserslistrc'); var pkgBrowserslist; if ( isFile(pkg) ) { try { pkgBrowserslist = parsePackage(pkg); } catch (e) { console.warn( '[Browserslist] Could not parse ' + pkg + '. ' + 'Ignoring it.'); } } if ( isFile(config) && pkgBrowserslist ) { error( dir + ' contains both browserslist ' + 'and package.json with browsers'); } else if ( isFile(rc) && pkgBrowserslist ) { error( dir + ' contains both .browserslistrc ' + 'and package.json with browsers'); } else if ( isFile(config) && isFile(rc) ) { error(dir + ' contains both .browserslistrc and browserslist'); } else if ( isFile(config) ) { return browserslist.readConfig(config); } else if ( isFile(rc) ) { return browserslist.readConfig(rc); } else if ( pkgBrowserslist ) { return pkgBrowserslist; } }); if ( cacheEnabled ) { configCache[cacheKey] = resolved; } return resolved; }
...
if ( typeof queries === 'undefined' || queries === null ) {
if ( process.env.BROWSERSLIST ) {
queries = process.env.BROWSERSLIST;
} else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) {
var file = opts.config || process.env.BROWSERSLIST_CONFIG;
queries = pickEnv(browserslist.readConfig(file), opts);
} else if ( opts.path ) {
queries = pickEnv(browserslist.findConfig(opts.path), opts);
}
}
if ( typeof queries === 'undefined' || queries === null ) {
queries = browserslist.defaults;
}
...
index = function (queries, opts) { if ( typeof opts === 'undefined' ) opts = { }; if ( !opts.hasOwnProperty('path') ) { opts.path = path.resolve('.'); } if ( typeof queries === 'undefined' || queries === null ) { if ( process.env.BROWSERSLIST ) { queries = process.env.BROWSERSLIST; } else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) { var file = opts.config || process.env.BROWSERSLIST_CONFIG; queries = pickEnv(browserslist.readConfig(file), opts); } else if ( opts.path ) { queries = pickEnv(browserslist.findConfig(opts.path), opts); } } if ( typeof queries === 'undefined' || queries === null ) { queries = browserslist.defaults; } if ( typeof queries === 'string' ) { queries = queries.split(/,\s*/); } var context = { }; var stats = getStat(opts); if ( stats ) { if ( typeof stats === 'string' ) { try { stats = JSON.parse(fs.readFileSync(stats)); } catch (e) { error('Can\'t read ' + stats); } } if ( 'dataByBrowser' in stats ) { stats = stats.dataByBrowser; } context.customUsage = { }; for ( var browser in stats ) { fillUsage(context.customUsage, browser, stats[browser]); } } var result = []; queries.forEach(function (selection) { if ( selection.trim() === '' ) return; var exclude = selection.indexOf('not ') === 0; if ( exclude ) selection = selection.slice(4); for ( var i in browserslist.queries ) { var type = browserslist.queries[i]; var match = selection.match(type.regexp); if ( match ) { var args = [context].concat(match.slice(1)); var array = type.select.apply(browserslist, args); if ( exclude ) { array = array.concat(array.map(function (j) { return j.replace(/\s\d+/, ' 0'); })); result = result.filter(function (j) { return array.indexOf(j) === -1; }); } else { result = result.concat(array); } return; } } error('Unknown browser query `' + selection + '`'); }); result = result.map(function (i) { var parts = i.split(' '); var name = parts[0]; var version = parts[1]; if ( version === '0' ) { return name + ' ' + browserslist.byName(name).versions[0]; } else { return i; } }).sort(function (name1, name2) { name1 = name1.split(' '); name2 = name2.split(' '); if ( name1[0] === name2[0] ) { if ( FLOAT_RANGE.test(name1[1]) && FLOAT_RANGE.test(name2[1]) ) { return parseFloat(name2[1]) - parseFloat(name1[1]); } else { return compareStrings(name2[1], name1[1]); } } else { return compareStrings(name1[0], name2[0]); } }); return uniq(result); }
n/a
parseConfig = function (string) { var result = { defaults: [] }; var section = 'defaults'; string.toString() .replace(/#[^\n]*/g, '') .split(/\n/) .map(function (line) { return line.trim(); }) .filter(function (line) { return line !== ''; }) .forEach(function (line) { if ( IS_SECTION.test(line) ) { section = line.match(IS_SECTION)[1].trim(); result[section] = result[section] || []; } else { result[section].push(line); } }); return result; }
...
};
// Read and parse config
browserslist.readConfig = function (file) {
if ( !isFile(file) ) {
error('Can\'t read ' + file + ' config');
}
return browserslist.parseConfig(fs.readFileSync(file));
};
// Find config, read file and parse it
browserslist.findConfig = function (from) {
from = path.resolve(from);
var cacheKey = isFile(from) ? path.dirname(from) : from;
...
readConfig = function (file) { if ( !isFile(file) ) { error('Can\'t read ' + file + ' config'); } return browserslist.parseConfig(fs.readFileSync(file)); }
...
}
if ( typeof queries === 'undefined' || queries === null ) {
if ( process.env.BROWSERSLIST ) {
queries = process.env.BROWSERSLIST;
} else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) {
var file = opts.config || process.env.BROWSERSLIST_CONFIG;
queries = pickEnv(browserslist.readConfig(file), opts);
} else if ( opts.path ) {
queries = pickEnv(browserslist.findConfig(opts.path), opts);
}
}
if ( typeof queries === 'undefined' || queries === null ) {
queries = browserslist.defaults;
...
index = function (queries, opts) { if ( typeof opts === 'undefined' ) opts = { }; if ( !opts.hasOwnProperty('path') ) { opts.path = path.resolve('.'); } if ( typeof queries === 'undefined' || queries === null ) { if ( process.env.BROWSERSLIST ) { queries = process.env.BROWSERSLIST; } else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) { var file = opts.config || process.env.BROWSERSLIST_CONFIG; queries = pickEnv(browserslist.readConfig(file), opts); } else if ( opts.path ) { queries = pickEnv(browserslist.findConfig(opts.path), opts); } } if ( typeof queries === 'undefined' || queries === null ) { queries = browserslist.defaults; } if ( typeof queries === 'string' ) { queries = queries.split(/,\s*/); } var context = { }; var stats = getStat(opts); if ( stats ) { if ( typeof stats === 'string' ) { try { stats = JSON.parse(fs.readFileSync(stats)); } catch (e) { error('Can\'t read ' + stats); } } if ( 'dataByBrowser' in stats ) { stats = stats.dataByBrowser; } context.customUsage = { }; for ( var browser in stats ) { fillUsage(context.customUsage, browser, stats[browser]); } } var result = []; queries.forEach(function (selection) { if ( selection.trim() === '' ) return; var exclude = selection.indexOf('not ') === 0; if ( exclude ) selection = selection.slice(4); for ( var i in browserslist.queries ) { var type = browserslist.queries[i]; var match = selection.match(type.regexp); if ( match ) { var args = [context].concat(match.slice(1)); var array = type.select.apply(browserslist, args); if ( exclude ) { array = array.concat(array.map(function (j) { return j.replace(/\s\d+/, ' 0'); })); result = result.filter(function (j) { return array.indexOf(j) === -1; }); } else { result = result.concat(array); } return; } } error('Unknown browser query `' + selection + '`'); }); result = result.map(function (i) { var parts = i.split(' '); var name = parts[0]; var version = parts[1]; if ( version === '0' ) { return name + ' ' + browserslist.byName(name).versions[0]; } else { return i; } }).sort(function (name1, name2) { name1 = name1.split(' '); name2 = name2.split(' '); if ( name1[0] === name2[0] ) { if ( FLOAT_RANGE.test(name1[1]) && FLOAT_RANGE.test(name2[1]) ) { return parseFloat(name2[1]) - parseFloat(name1[1]); } else { return compareStrings(name2[1], name1[1]); } } else { return compareStrings(name1[0], name2[0]); } }); return uniq(result); }
n/a
byName = function (name) { name = name.toLowerCase(); name = browserslist.aliases[name] || name; return browserslist.data[name]; }
...
error('Unknown browser query `' + selection + '`');
});
result = result.map(function (i) {
var parts = i.split(' ');
var name = parts[0];
var version = parts[1];
if ( version === '0' ) {
return name + ' ' + browserslist.byName(name).versions[0];
} else {
return i;
}
}).sort(function (name1, name2) {
name1 = name1.split(' ');
name2 = name2.split(' ');
if ( name1[0] === name2[0] ) {
...
checkName = function (name) { var data = browserslist.byName(name); if ( !data ) error('Unknown browser ' + name); return data; }
...
return selected;
}
},
lastByBrowser: {
regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i,
select: function (context, versions, name) {
var data = browserslist.checkName(name);
return data.released.slice(-versions).map(function (v) {
return data.name + ' ' + v;
});
}
},
globalStatistics: {
...
clearCaches = function () { filenessCache = {}; configCache = {}; }
...
Browserslist caches the configuration it reads from `package.json` and
`browserslist` files, as well as knowledge about the existence of files,
for the duration of the hosting process.
To clear these caches, use:
```js
browserslist.clearCaches();
```
To disable the caching altogether, set the `BROWSERSLIST_DISABLE_CACHE`
environment variable.
...
coverage = function (browsers, country) { if ( country && country !== 'global' ) { country = country.toUpperCase(); loadCountryStatistics(country); } else { country = 'global'; } return browsers.reduce(function (all, i) { var usage = browserslist.usage[country][i]; if ( usage === undefined ) { usage = browserslist.usage[country][i.replace(/ [\d.]+$/, ' 0')]; } return all + (usage || 0); }, 0); }
...
## 1.3.1
* Add Safari TP support.
## 1.3
* Add coverage for specific country (by Joshua Wise).
## 1.2
* Add `browserslist.coverage()` method.
* Add `--coverage` and `-c` argument to CLI.
* Add `-v` argument support to CLI.
* Better error handling in CLI.
## 1.1.3
* Fix jspm support (by Sean Anderson).
...
findConfig = function (from) { from = path.resolve(from); var cacheKey = isFile(from) ? path.dirname(from) : from; if ( cacheKey in configCache ) { return configCache[cacheKey]; } var resolved = eachParent(from, function (dir) { var config = path.join(dir, 'browserslist'); var pkg = path.join(dir, 'package.json'); var rc = path.join(dir, '.browserslistrc'); var pkgBrowserslist; if ( isFile(pkg) ) { try { pkgBrowserslist = parsePackage(pkg); } catch (e) { console.warn( '[Browserslist] Could not parse ' + pkg + '. ' + 'Ignoring it.'); } } if ( isFile(config) && pkgBrowserslist ) { error( dir + ' contains both browserslist ' + 'and package.json with browsers'); } else if ( isFile(rc) && pkgBrowserslist ) { error( dir + ' contains both .browserslistrc ' + 'and package.json with browsers'); } else if ( isFile(config) && isFile(rc) ) { error(dir + ' contains both .browserslistrc and browserslist'); } else if ( isFile(config) ) { return browserslist.readConfig(config); } else if ( isFile(rc) ) { return browserslist.readConfig(rc); } else if ( pkgBrowserslist ) { return pkgBrowserslist; } }); if ( cacheEnabled ) { configCache[cacheKey] = resolved; } return resolved; }
...
if ( typeof queries === 'undefined' || queries === null ) {
if ( process.env.BROWSERSLIST ) {
queries = process.env.BROWSERSLIST;
} else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) {
var file = opts.config || process.env.BROWSERSLIST_CONFIG;
queries = pickEnv(browserslist.readConfig(file), opts);
} else if ( opts.path ) {
queries = pickEnv(browserslist.findConfig(opts.path), opts);
}
}
if ( typeof queries === 'undefined' || queries === null ) {
queries = browserslist.defaults;
}
...
parseConfig = function (string) { var result = { defaults: [] }; var section = 'defaults'; string.toString() .replace(/#[^\n]*/g, '') .split(/\n/) .map(function (line) { return line.trim(); }) .filter(function (line) { return line !== ''; }) .forEach(function (line) { if ( IS_SECTION.test(line) ) { section = line.match(IS_SECTION)[1].trim(); result[section] = result[section] || []; } else { result[section].push(line); } }); return result; }
...
};
// Read and parse config
browserslist.readConfig = function (file) {
if ( !isFile(file) ) {
error('Can\'t read ' + file + ' config');
}
return browserslist.parseConfig(fs.readFileSync(file));
};
// Find config, read file and parse it
browserslist.findConfig = function (from) {
from = path.resolve(from);
var cacheKey = isFile(from) ? path.dirname(from) : from;
...
readConfig = function (file) { if ( !isFile(file) ) { error('Can\'t read ' + file + ' config'); } return browserslist.parseConfig(fs.readFileSync(file)); }
...
}
if ( typeof queries === 'undefined' || queries === null ) {
if ( process.env.BROWSERSLIST ) {
queries = process.env.BROWSERSLIST;
} else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) {
var file = opts.config || process.env.BROWSERSLIST_CONFIG;
queries = pickEnv(browserslist.readConfig(file), opts);
} else if ( opts.path ) {
queries = pickEnv(browserslist.findConfig(opts.path), opts);
}
}
if ( typeof queries === 'undefined' || queries === null ) {
queries = browserslist.defaults;
...