refactor: replace caniuse-db by mdn-browser-compat-data (#11838)
* refactor: replace caniuse-db by mdn-browser-compat-data * fix broken test
This commit is contained in:
@@ -1,40 +1,59 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
|
||||
const moduleSupport = require("caniuse-db/features-json/es6-module.json");
|
||||
|
||||
const acceptedWithCaveats = new Set(["safari", "ios_saf"]);
|
||||
const compatData = require("mdn-browser-compat-data").javascript;
|
||||
|
||||
// Map mdn-browser-compat-data to browserslist browser names
|
||||
const browserNameMap = {
|
||||
and_chr: "chrome",
|
||||
and_ff: "firefox",
|
||||
android: "chrome", // map to chrome here as Android WebView 61 is Chromium-based
|
||||
op_mob: "opera",
|
||||
chrome_android: "and_chr",
|
||||
firefox_android: "and_ff",
|
||||
safari_ios: "ios_saf",
|
||||
nodejs: "node",
|
||||
webview_android: "android",
|
||||
opera_android: "op_mob",
|
||||
samsunginternet_android: "samsung",
|
||||
};
|
||||
const { stats } = moduleSupport;
|
||||
|
||||
const allowedBrowsers = {};
|
||||
const browserSupportMap = {
|
||||
android: "chrome_android", // map to chrome here as Android WebView 61 is Chromium-based
|
||||
};
|
||||
|
||||
Object.keys(stats).forEach(browser => {
|
||||
const browserName = browserNameMap[browser] || browser;
|
||||
const browserVersions = stats[browserName];
|
||||
const allowedVersions = Object.keys(browserVersions)
|
||||
.filter(value => {
|
||||
// Edge 16/17 are marked as "y #6"
|
||||
return acceptedWithCaveats.has(browserName)
|
||||
? browserVersions[value][0] === "a"
|
||||
: browserVersions[value].startsWith("y");
|
||||
})
|
||||
.sort((a, b) => a - b);
|
||||
|
||||
if (allowedVersions[0] !== undefined) {
|
||||
// Handle cases where caniuse specifies version as: "11.0-11.2"
|
||||
allowedBrowsers[browser] = allowedVersions[0].split("-")[0];
|
||||
function browserVersion(browser, version_added) {
|
||||
if (browser === "samsunginternet_android" && version_added === "8.0") {
|
||||
return "8.2"; // samsung 8.0 is not defined in browserslist
|
||||
}
|
||||
});
|
||||
// fixme: preset-env maps opera_android as opera, this is incorrect as they have different engine mappings
|
||||
// see https://github.com/mdn/browser-compat-data/blob/master/browsers/opera_android.json
|
||||
if (browser === "opera_android" && version_added === "45") {
|
||||
return "48";
|
||||
}
|
||||
return version_added;
|
||||
}
|
||||
|
||||
function process(source) {
|
||||
const stats = source.__compat.support;
|
||||
const allowedBrowsers = {};
|
||||
|
||||
Object.keys(stats).forEach(browser => {
|
||||
const browserName = browserNameMap[browser] ?? browser;
|
||||
let browserSupport = stats[browserSupportMap[browserName] ?? browser];
|
||||
if (Array.isArray(browserSupport)) {
|
||||
browserSupport = browserSupport[0]; // The first item is the most progressive support
|
||||
}
|
||||
if (browserSupport.version_added && !browserSupport.flags) {
|
||||
allowedBrowsers[browserName] = browserVersion(
|
||||
browser,
|
||||
browserSupport.version_added
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
return allowedBrowsers;
|
||||
}
|
||||
|
||||
const dataPath = path.join(__dirname, "../data/native-modules.json");
|
||||
const data = {
|
||||
"es6.module": allowedBrowsers,
|
||||
"es6.module": process(compatData.statements.export),
|
||||
};
|
||||
fs.writeFileSync(dataPath, `${JSON.stringify(data, null, 2)}\n`);
|
||||
exports.process = process;
|
||||
|
||||
Reference in New Issue
Block a user