Skip to content

Instantly share code, notes, and snippets.

@brad-jones
Created November 7, 2017 08:51
Show Gist options
  • Save brad-jones/2f9b9bf0d230ce916960eac933f9da36 to your computer and use it in GitHub Desktop.
Save brad-jones/2f9b9bf0d230ce916960eac933f9da36 to your computer and use it in GitHub Desktop.
Get a list of required polyfill.io features based on browserslist
const semver = require('semver');
const browserslist = require('browserslist');
const polyFillService = require('polyfill-service');
function browserVersionMatches(browsersListVersion, polyFillServiceVersion)
{
// Do some quick and easy checks first
if (browsersListVersion === polyFillServiceVersion) return true;
if (polyFillServiceVersion === '*') return true;
if (browsersListVersion === 'all') return true;
// Otherwise convert the browser version into a semver.
let version = semver.clean(browsersListVersion, true);
if (version === null) version = semver.clean(browsersListVersion + '.0.0', true);
if (version === null) version = semver.clean(browsersListVersion + '.0', true);
if (version === null) throw new Error(`Could not convert '${browsersListVersion}' into semver`);
// Then check to see if it satisfies the polyFill range.
return semver.satisfies(version, polyFillServiceVersion, true);
}
(async () =>
{
let requirePolyFills = [];
var browsers = browserslist();
for (let fill of await polyFillService.listAllPolyfills())
{
// The Locales add lots of noise, ignore for now
if (fill.startsWith('Intl')) continue;
let fillMeta = await polyFillService.describePolyfill(fill);
if (fillMeta.browsers)
{
for (let browser of browsers)
{
let segments = browser.split(' ');
let browserName = segments[0];
if (fillMeta.browsers[browserName])
{
let browserVersions = segments[1].split('-');
for (let browserVersion of browserVersions)
{
if (browserVersionMatches(browserVersion, fillMeta.browsers[browserName]))
{
if (requirePolyFills.indexOf(fill) === -1)
{
requirePolyFills.push(fill);
}
}
}
}
}
}
}
console.log(requirePolyFills);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment