@web/dev-server-legacy
Version:
Plugin for legacy browsers in @web/dev-server
119 lines • 4.72 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isLegacyBrowser = void 0;
/* eslint-disable no-console */
const browserslist_useragent_1 = require("browserslist-useragent");
const browserslist_1 = __importDefault(require("browserslist"));
const caniuse = __importStar(require("caniuse-api"));
/**
* We compile to es modules when the browser supports module scripts, dynamic imports
* and import.meta.url. Unfortunately, caniuse doesn't report import.meta.url. Chrome 63
* is the only browser which suppors dynamic imports but not import.meta.url.
*/
const moduleFeatures = ['es6-module', 'es6-module-dynamic-import'];
const cache = new Map();
const browserAliases = {
'UC Browser': 'UCAndroid',
};
/**
* The user agent parser does not always return a valid version for samsung,
* so we need to normalize it.
*/
function normalizeSamsungVersion(browser, version) {
try {
(0, browserslist_1.default)(`${browser} ${version}`);
// browserslist didn't throw, return the valid version
return version;
}
catch (error) {
// we gave an invalid version to browserslist, so we try to
// find the nearest matching major version for samsung browser
const validVersions = [
...Object.keys(browserslist_1.default.versionAliases.samsung),
...browserslist_1.default.data.samsung.versions,
];
return validVersions.find(validVersion => validVersion[0] === version[0]);
}
}
/**
* The user agent parser returns patch versions, which browserslist doesn't
* know about. Mostly the major version is sufficient, except for safari.
*/
function getBrowserVersion(resolvedUA) {
const version = resolvedUA.version.split('.');
switch (resolvedUA.family) {
case 'Safari':
case 'iOS':
return `${version[0]}.${version[1]}`;
case 'Samsung':
return normalizeSamsungVersion(resolvedUA.family, version);
default:
return version[0];
}
}
function getBrowserName(browserName) {
return browserAliases[browserName] || browserName;
}
/**
* Returns whether this browser supports es modules. We count this when the browser
* supports module syntax, scripts, dynamic imports. We can't feature detect
* import.meta.url but any browsers which supports dynamic import supports import.meta.url,
* except for chrome 63.
*/
function getSupportsEsm(browserTarget) {
if (browserTarget.toLowerCase() === 'chrome 63') {
return false;
}
return moduleFeatures.every(ft => caniuse.isSupported(ft, browserTarget));
}
/**
* Calculates the user agent's compatibility.
*/
function calculateIsLegacyBrowser(userAgent, logger) {
try {
const resolvedUA = (0, browserslist_useragent_1.resolveUserAgent)(userAgent);
const browserTarget = `${getBrowserName(resolvedUA.family)} ${getBrowserVersion(resolvedUA)}`;
return !getSupportsEsm(browserTarget);
}
catch (error) {
logger.warn(`[@web/dev-server-legacy]: Unknown user agent ${userAgent}, treating it as a legacy browser.`);
return true;
}
}
function isLegacyBrowser(ctx, logger) {
const userAgent = ctx.get('user-agent');
let isLegacyBrowser = cache.get(userAgent);
if (isLegacyBrowser == null) {
isLegacyBrowser = calculateIsLegacyBrowser(userAgent, logger);
cache.set(userAgent, isLegacyBrowser);
}
return isLegacyBrowser;
}
exports.isLegacyBrowser = isLegacyBrowser;
//# sourceMappingURL=isLegacyBrowser.js.map
;