UNPKG

farm-browserslist-generator

Version:

A library that makes generating and validating Browserslists a breeze!

1 lines 149 kB
{"version":3,"file":"index.cjs","sources":["../../src/browserslist-generator/ensure-semver.ts","../../src/browserslist-generator/compare-versions.ts","../../src/browserslist-generator/normalize-browser-version-regexp.ts","../../src/browserslist-generator/browser-version.ts","../../src/browserslist-generator/constant.ts","../../src/browserslist-generator/ecma-version.ts","../../src/browserslist-generator/range-correction.ts","../../src/browserslist-generator/i-caniuse.ts","../../src/browserslist-generator/ua-parser-wrapper.ts","../../src/browserslist-generator/browserslist-generator.ts"],"sourcesContent":["import type {SemVer} from \"semver\";\nimport {coerce as _coerce} from \"semver\";\nimport {SAFARI_TP_MAJOR_VERSION} from \"./browser-version.js\";\nimport type {CaniuseBrowser} from \"./i-caniuse.js\";\n\n/**\n * Coerces the given version\n */\nexport function ensureSemver(browser: CaniuseBrowser | undefined, version: string): SemVer {\n\tif ((browser === \"op_mini\" || browser === \"android\") && version === \"all\") {\n\t\treturn _coerce(\"0.0.0\")!;\n\t} else if (browser === \"safari\" && version === \"TP\") {\n\t\treturn SAFARI_TP_MAJOR_VERSION;\n\t}\n\n\treturn _coerce(version, {loose: true})!;\n}\n\n/**\n * Coerces the given version\n */\nexport function coerceToString(browser: CaniuseBrowser, version: string): string {\n\treturn ensureSemver(browser, version).toString();\n}\n","/**\n * Compares two versions, a and b\n */\nexport function compareVersions(a: string, b: string): number {\n\tconst normalizedA = isNaN(parseFloat(a)) ? a : parseFloat(a);\n\tconst normalizedB = isNaN(parseFloat(b)) ? b : parseFloat(b);\n\n\tif (typeof normalizedA === \"string\" && typeof normalizedB !== \"string\") {\n\t\treturn 1;\n\t}\n\n\tif (typeof normalizedB === \"string\" && typeof normalizedA !== \"string\") {\n\t\treturn -1;\n\t}\n\n\tif (normalizedA < normalizedB) return -1;\n\tif (normalizedA > normalizedB) return 1;\n\treturn 0;\n}\n","/**\n * A Regular Expression that captures the part of a browser version that should be kept\n */\nexport const NORMALIZE_BROWSER_VERSION_REGEXP = /(?![\\d.,]+-)-*(.*)/;\n","import Browserslist from \"browserslist\";\nimport {coerce as _coerce, gt, gte, lt} from \"semver\";\nimport {ensureSemver} from \"./ensure-semver.js\";\nimport {compareVersions} from \"./compare-versions.js\";\nimport type {CaniuseBrowser} from \"./i-caniuse.js\";\nimport {NORMALIZE_BROWSER_VERSION_REGEXP} from \"./normalize-browser-version-regexp.js\";\n\nexport const SAFARI_TP_MAJOR_VERSION = (() => {\n\tconst versions = getSortedBrowserVersions(\"safari\");\n\tconst lastVersionBeforeTp = versions[versions.length - 2];\n\tconst coerced = _coerce(lastVersionBeforeTp)!;\n\tif (coerced.minor === 9) {\n\t\treturn _coerce(coerced.major + 1)!;\n\t} else {\n\t\treturn _coerce(`${coerced.major}.${coerced.minor + 1}.0`)!;\n\t}\n})();\n\n/**\n * Ensures that for any given version of a browser, if it is newer than the latest known version, the last known version will be used as a fallback\n */\nexport function normalizeBrowserVersion(browser: CaniuseBrowser, givenVersion: string, versions: string[] = getSortedBrowserVersions(browser), allowSmaller = false): string {\n\tconst givenVersionCoerced = ensureSemver(browser, givenVersion);\n\tconst latestVersion = getLatestVersionOfBrowser(browser);\n\tconst latestVersionCoerced = ensureSemver(browser, latestVersion);\n\n\tif (givenVersionCoerced == null || latestVersionCoerced == null) {\n\t\tthrow new TypeError(`Could not detect the version of: '${givenVersion}' for browser: ${browser}`);\n\t}\n\n\tif (\n\t\tgivenVersionCoerced.major > latestVersionCoerced.major ||\n\t\t(givenVersionCoerced.major === latestVersionCoerced.major && givenVersionCoerced.minor > latestVersionCoerced.minor) ||\n\t\t(givenVersionCoerced.major === latestVersionCoerced.major && givenVersionCoerced.minor === latestVersionCoerced.minor && givenVersionCoerced.patch > latestVersionCoerced.patch)\n\t) {\n\t\treturn latestVersion;\n\t}\n\n\tconst closestMatch = getClosestMatchingBrowserVersion(browser, givenVersion, versions);\n\n\t// Allow smaller, but not larger browser versions than the known ones\n\tif (allowSmaller && lt(givenVersionCoerced, ensureSemver(browser, closestMatch), {loose: true})) {\n\t\treturn givenVersion;\n\t}\n\n\treturn closestMatch;\n}\n\n/**\n * Gets the known version of the given browser that is closest to the given version\n */\nexport function getClosestMatchingBrowserVersion(browser: CaniuseBrowser, version: string, versions: string[] = getSortedBrowserVersions(browser)): string {\n\tconst coerced = ensureSemver(browser, version);\n\n\tif (browser === \"op_mini\" && version === \"all\") return \"all\";\n\tif (browser === \"safari\") {\n\t\tif (version === \"TP\") return \"TP\";\n\t\t// If the given version is greater than or equal to the latest non-technical preview version of Safari, the closest match IS TP.\n\t\telse if (gt(ensureSemver(browser, `${coerced.major}.${coerced.minor}`), ensureSemver(browser, versions.slice(-2)[0]))) return \"TP\";\n\t}\n\n\tlet candidate = versions[0];\n\n\tversions.forEach(currentVersion => {\n\t\tconst currentCoerced = ensureSemver(browser, currentVersion);\n\t\tif (gte(coerced, currentCoerced)) {\n\t\t\tcandidate = currentVersion;\n\t\t}\n\t});\n\n\treturn candidate;\n}\n\nexport function getSortedBrowserVersionsWithLeadingVersion(browser: CaniuseBrowser, inputVersion?: string): string[] {\n\tconst versions: string[] = getSortedBrowserVersions(browser);\n\tconst [firstVersion] = versions;\n\n\tif (firstVersion != null && inputVersion != null) {\n\t\tconst firstVersionSemver = ensureSemver(browser, firstVersion);\n\t\tlet nextInputVersion = inputVersion;\n\t\twhile (true) {\n\t\t\tconst nextInputSemver = ensureSemver(browser, nextInputVersion);\n\t\t\tif (gt(firstVersionSemver, nextInputSemver)) {\n\t\t\t\tversions.unshift(nextInputVersion);\n\t\t\t\tnextInputVersion = String(nextInputSemver.major + 1);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn versions;\n}\n\n/**\n * Gets all versions of the given browser, sorted\n */\nexport function getSortedBrowserVersions(browser: CaniuseBrowser): string[] {\n\t// Generate the Browserslist query\n\tconst queryResult: string[] = Browserslist([`>= 0%`, `unreleased versions`]);\n\tconst versions: string[] = [];\n\n\t// First, organize the different versions of the browsers inside the Map\n\tqueryResult.forEach(part => {\n\t\tconst [currentBrowser, version] = part.split(\" \") as [CaniuseBrowser, string];\n\t\tif (currentBrowser !== browser) return;\n\n\t\tconst versionMatch = version.match(NORMALIZE_BROWSER_VERSION_REGEXP);\n\t\tconst normalizedVersion = versionMatch == null ? version : versionMatch[1];\n\n\t\tversions.push(normalizedVersion);\n\t});\n\n\treturn versions.sort(compareVersions);\n}\n\n/**\n * Gets the latest version of the given browser\n */\nexport function getLatestVersionOfBrowser(browser: CaniuseBrowser): string {\n\tconst versions = getSortedBrowserVersions(browser);\n\treturn versions[versions.length - 1];\n}\n\n/**\n * Gets the oldest (stable) version of the given browser\n */\nexport function getOldestVersionOfBrowser(browser: CaniuseBrowser): string {\n\tconst versions = getSortedBrowserVersions(browser);\n\treturn versions[0];\n}\n\n/**\n * Gets the previous version of the given browser from the given version\n */\nexport function getPreviousVersionOfBrowser(browser: CaniuseBrowser, version: string): string | undefined {\n\tconst versions = getSortedBrowserVersions(browser);\n\tconst indexOfVersion = versions.indexOf(normalizeBrowserVersion(browser, version, versions));\n\t// If the version isn't included, or if it is the first version of it, return undefined\n\tif (indexOfVersion <= 0) return undefined;\n\treturn versions[indexOfVersion - 1];\n}\n\n/**\n * Gets the previous version of the given browser from the given version\n */\nexport function getNextVersionOfBrowser(browser: CaniuseBrowser, version: string): string | undefined {\n\tconst versions = getSortedBrowserVersions(browser);\n\tconst indexOfVersion = versions.indexOf(normalizeBrowserVersion(browser, version, versions));\n\t// If the version isn't included, or if it is the first version of it, return undefined\n\tif (indexOfVersion <= 0) return undefined;\n\treturn versions[indexOfVersion + 1];\n}\n","/**\n * Caniuse has only a limited set of supported browsers.\n * There are cases where there is simply no way to guess\n * a browser based on a User Agent, and in these cases\n * this can be used as a fallback.\n * Chrome is the world's most used browser, and as an evergreen\n * browser, it is commonly the newest version. But to be safe\n * This fallback browser is placed a bit in the past\n */\nexport const UNKNOWN_CANIUSE_BROWSER = {\n\tbrowser: \"chrome\",\n\tversion: \"80\"\n} as const;\n","export type EcmaVersion = \"es3\" | \"es5\" | \"es2015\" | \"es2016\" | \"es2017\" | \"es2018\" | \"es2019\" | \"es2020\" | \"es2021\" | \"es2022\" | \"es2023\";\n\nexport const ES5_FEATURES: string[] = [\n\t\"javascript.builtins.Object.create\",\n\t\"javascript.builtins.Object.getPrototypeOf\",\n\t\"javascript.builtins.Object.defineProperty\",\n\t\"javascript.builtins.Object.defineProperties\",\n\t\"javascript.builtins.Object.getOwnPropertyDescriptor\",\n\t\"javascript.builtins.Object.getOwnPropertyNames\",\n\t\"javascript.builtins.Object.keys\",\n\t\"javascript.builtins.Object.preventExtensions\",\n\t\"javascript.builtins.Object.isExtensible\",\n\t\"javascript.builtins.Object.seal\",\n\t\"javascript.builtins.Object.isSealed\",\n\t\"javascript.builtins.Object.freeze\",\n\t\"javascript.builtins.Object.isFrozen\",\n\t\"javascript.builtins.Function.bind\",\n\t\"javascript.builtins.String.trim\",\n\t\"javascript.builtins.Array.isArray\",\n\t\"javascript.builtins.Array.every\",\n\t\"javascript.builtins.Array.filter\",\n\t\"javascript.builtins.Array.forEach\",\n\t\"javascript.builtins.Array.indexOf\",\n\t\"javascript.builtins.Array.lastIndexOf\",\n\t\"javascript.builtins.Array.map\",\n\t\"javascript.builtins.Array.reduce\",\n\t\"javascript.builtins.Array.some\",\n\t\"javascript.builtins.JSON.parse\",\n\t\"javascript.builtins.JSON.stringify\",\n\t\"javascript.builtins.Date.now\",\n\t\"javascript.builtins.Date.toISOString\"\n];\n\nexport const ES2015_FEATURES: string[] = [\n\t...ES5_FEATURES,\n\t\"javascript.classes\",\n\t\"javascript.statements.const\",\n\t\"javascript.statements.let\",\n\t\"javascript.functions.arrow_functions\",\n\t\"javascript.functions.rest_parameters\",\n\t\"javascript.grammar.template_literals\",\n\t\"javascript.operators.destructuring\",\n\t\"javascript.operators.spread.spread_in_arrays\",\n\t\"javascript.functions.default_parameters\",\n\t\"javascript.builtins.RegExp.sticky\",\n\t\"javascript.operators.object_initializer.shorthand_property_names\",\n\t\"javascript.operators.object_initializer.computed_property_names\",\n\t\"javascript.operators.object_initializer.shorthand_method_names\"\n];\n\nexport const ES2016_FEATURES: string[] = [...ES2015_FEATURES, \"javascript.operators.exponentiation\", \"javascript.builtins.Array.includes\"];\n\nexport const ES2017_FEATURES: string[] = [\n\t...ES2016_FEATURES,\n\t\"javascript.builtins.AsyncFunction\",\n\t\"javascript.builtins.Object.values\",\n\t\"javascript.builtins.Object.entries\",\n\t\"javascript.builtins.Object.getOwnPropertyDescriptors\",\n\t\"javascript.builtins.String.padStart\",\n\t\"javascript.builtins.String.padEnd\"\n];\n\nexport const ES2018_FEATURES: string[] = [...ES2017_FEATURES, \"javascript.operators.spread.spread_in_object_literals\", \"javascript.builtins.Promise.finally\"];\n\nexport const ES2019_FEATURES: string[] = [\n\t...ES2018_FEATURES,\n\t\"javascript.builtins.Array.flat\",\n\t\"javascript.builtins.Array.flatMap\",\n\t\"javascript.builtins.Object.fromEntries\",\n\t\"javascript.builtins.String.trimStart\",\n\t\"javascript.builtins.String.trimEnd\",\n\t\"javascript.builtins.JSON.json_superset\",\n\t\"javascript.builtins.JSON.stringify.well_formed_stringify\",\n\t\"javascript.builtins.Symbol.description\",\n\t\"javascript.statements.try_catch.optional_catch_binding\"\n];\n\nexport const ES2020_FEATURES: string[] = [...ES2019_FEATURES, \"javascript.builtins.String.matchAll\"];\n\nexport const ES2021_FEATURES: string[] = [\n\t...ES2020_FEATURES,\n\t\"javascript.operators.logical_or_assignment\",\n\t\"javascript.operators.nullish_coalescing_assignment\",\n\t\"javascript.operators.logical_and_assignment\",\n\t\"javascript.builtins.String.replaceAll\",\n\t\"javascript.grammar.numeric_separators\",\n\t\"javascript.builtins.Promise.any\"\n];\n\nexport const ES2022_FEATURES: string[] = [\n\t...ES2021_FEATURES,\n\t\"javascript.builtins.Array.at\",\n\t\"javascript.builtins.String.matchAll\",\n\t\"javascript.classes.public_class_fields\",\n\t\"javascript.classes.private_class_fields\",\n\t\"javascript.classes.private_class_fields_in\",\n\t\"javascript.classes.static_class_fields\",\n\t\"javascript.operators.await.top_level\",\n\t\"javascript.builtins.RegExp.hasIndices\"\n];\n\nexport const ES2023_FEATURES: string[] = [\n\t...ES2022_FEATURES,\n\t\"javascript.builtins.Array.findLast\",\n\t\"javascript.builtins.Array.findLastIndex\",\n\t\"javascript.grammar.hashbang_comments\",\n\t\"javascript.builtins.WeakMap.symbol_as_keys\",\n\t\"javascript.builtins.Array.toReversed\",\n\t\"javascript.builtins.Array.toSorted\",\n\t\"javascript.builtins.Array.toSpliced\",\n\t\"javascript.builtins.Array.with\"\n];\n","import {gte, lte} from \"semver\";\nimport {getSortedBrowserVersions} from \"./browser-version.js\";\nimport {coerceToString} from \"./ensure-semver.js\";\nimport type {CaniuseBrowser, CaniuseSupportKind, CaniuseDataCorrection} from \"./i-caniuse.js\";\n\n/**\n * Applies the given correction within the given version range\n */\nexport function rangeCorrection(browser: CaniuseBrowser, supportKind: CaniuseSupportKind, start?: string, end?: string): CaniuseDataCorrection[] {\n\tconst versions = getSortedBrowserVersions(browser);\n\tconst corrections: CaniuseDataCorrection[] = [];\n\n\tversions.forEach(version => {\n\t\tlet shouldSet = false;\n\n\t\tif (start == null && end == null) {\n\t\t\tshouldSet = true;\n\t\t} else if (start != null && end == null) {\n\t\t\tif (version === \"TP\") {\n\t\t\t\tshouldSet = true;\n\t\t\t} else if (version === \"all\") {\n\t\t\t\tshouldSet = true;\n\t\t\t} else {\n\t\t\t\tshouldSet = gte(coerceToString(browser, version), coerceToString(browser, start));\n\t\t\t}\n\t\t} else if (start == null && end != null) {\n\t\t\tif (version === \"TP\") {\n\t\t\t\tshouldSet = end === \"TP\";\n\t\t\t} else if (version === \"all\") {\n\t\t\t\tshouldSet = true;\n\t\t\t} else {\n\t\t\t\tshouldSet = lte(coerceToString(browser, version), coerceToString(browser, end));\n\t\t\t}\n\t\t} else if (start != null && end != null) {\n\t\t\tif (version === \"TP\") {\n\t\t\t\tshouldSet = end === \"TP\";\n\t\t\t} else if (version === \"all\") {\n\t\t\t\tshouldSet = true;\n\t\t\t} else {\n\t\t\t\tshouldSet = gte(coerceToString(browser, version), coerceToString(browser, start)) && lte(coerceToString(browser, version), coerceToString(browser, end));\n\t\t\t}\n\t\t}\n\n\t\tif (shouldSet) {\n\t\t\tcorrections.push({\n\t\t\t\tkind: supportKind,\n\t\t\t\tversion\n\t\t\t});\n\t\t}\n\t});\n\treturn corrections;\n}\n","export type CaniuseBrowser =\n\t| \"and_chr\"\n\t| \"and_ff\"\n\t| \"and_qq\"\n\t| \"and_uc\"\n\t| \"android\"\n\t| \"baidu\"\n\t| \"bb\"\n\t| \"chrome\"\n\t| \"edge\"\n\t| \"firefox\"\n\t| \"ie\"\n\t| \"ie_mob\"\n\t| \"ios_saf\"\n\t| \"op_mini\"\n\t| \"op_mob\"\n\t| \"opera\"\n\t| \"safari\"\n\t| \"samsung\";\n\nexport interface VersionedCaniuseBrowser {\n\tbrowser: CaniuseBrowser;\n\tversion: string;\n}\n\nexport const enum CaniuseSupportKind {\n\tAVAILABLE = \"AVAILABLE\",\n\tUNAVAILABLE = \"UNAVAILABLE\",\n\tPARTIAL_SUPPORT = \"PARTIAL_SUPPORT\",\n\tPREFIXED = \"PREFIXED\"\n}\n\nexport type CaniuseStats = {[Key in CaniuseBrowser]: {[key: string]: string}};\n\nexport type CaniuseStatsNormalized = {[Key in CaniuseBrowser]: {[key: string]: CaniuseSupportKind}};\n\nexport interface CaniuseFeature {\n\ttitle: string;\n\tstatus: string;\n\tstats: CaniuseStats;\n}\n\nexport interface CaniuseDataCorrection {\n\tkind: CaniuseSupportKind;\n\tversion: string;\n}\n\nexport type CaniuseBrowserCorrection = {[Key in CaniuseBrowser]?: CaniuseDataCorrection[]};\n","import {coerce} from \"semver\";\nimport {UAParser} from \"ua-parser-js\";\nimport isbot from \"isbot\";\nimport type {UseragentBrowser, UseragentDevice, UseragentEngine, UseragentOs} from \"./useragent/useragent-typed.js\";\n\nconst FIREFOX_MATCH = /Firefox\\/([\\d.]+)/i;\nconst IOS_REGEX_1 = /(iPhone)|(iPad)/i;\nconst IOS_REGEX_2 = /(iOS)\\s*([\\d._]+)/i;\nconst UNDERSCORED_VERSION_REGEX = /\\d+_/;\nconst FBSV_IOS_VERSION_REGEX = /FBSV\\/([\\d.]+)/i;\nconst IOS_14_5_UA_1 = /(CFNetwork\\/1237\\s+Darwin\\/20.4)/i;\nconst IOS_3_2_UA_1 = /(^Mobile\\/7B334b)/i;\n\n// Extend 'isbot' with more matches\nisbot.extend([\"bitdiscovery\", \"Dalvik/\", \"placid.app/v1\", \"WebsiteMetadataRetriever\", \"(compatible; aa/1.0)\"]);\n\n// These extension provide ua-parser-js with support for additional browsers\n// such as Sogou Explorer\nconst PARSER_EXTENSIONS = {\n\tengine: [[/(Chrome)\\/([\\d.]+)/i], [\"blink\", \"version\"]],\n\tbrowser: [\n\t\t[/(MetaSr)\\s*([\\d.]+)/i],\n\t\t[\"Sogou Explorer\", \"version\"],\n\t\t[/(HeyTapBrowser)\\/([\\d.]+)/i],\n\t\t[\"HeyTapBrowser\", \"version\"],\n\t\t[/(SamsungBrowser)\\/CrossApp/i],\n\t\t[\"Samsung Browser\"],\n\t\t[/(Nokia\\d+\\/[\\d.]+.*Profile\\/MIDP)/i],\n\t\t[\"WAP\"]\n\t]\n};\n\n/**\n * A class that wraps UAParser\n */\nexport class UaParserWrapper {\n\t/**\n\t * An instanceof UAParser\n\t */\n\tprivate readonly parser: InstanceType<typeof UAParser>;\n\n\tconstructor(private readonly userAgent: string) {\n\t\tthis.parser = new UAParser(userAgent, PARSER_EXTENSIONS);\n\t}\n\n\t/**\n\t * Gets the IUserAgentBrowser based on the UAParser\n\t */\n\tgetBrowser(): UseragentBrowser {\n\t\treturn this.extendGetBrowserResult(this.parser.getBrowser() as UseragentBrowser);\n\t}\n\n\t/**\n\t * Gets the IUserAgentOS based on the UAParser\n\t */\n\tgetOS(): UseragentOs {\n\t\treturn this.extendGetOsResult(this.parser.getOS() as UseragentOs);\n\t}\n\n\t/**\n\t * Gets the IUserAgentDevice based on the UAParser\n\t */\n\tgetDevice(): UseragentDevice {\n\t\treturn this.parser.getDevice() as UseragentDevice;\n\t}\n\n\t/**\n\t * Gets the IEngine based on the UAParser\n\t */\n\tgetEngine(): UseragentEngine {\n\t\treturn this.extendGetEngineResult(this.parser.getEngine() as UseragentEngine);\n\t}\n\n\t/**\n\t * Extends the result of calling 'getBrowser' on the UAParser and always takes bots into account\n\t */\n\tprivate extendGetBrowserResult(result: UseragentBrowser): UseragentBrowser {\n\t\t// Ensure that the EdgeHTML version is used\n\t\tif (result.name === \"Edge\") {\n\t\t\tconst engine = this.parser.getEngine() as UseragentEngine;\n\t\t\tif (engine.name === \"EdgeHTML\") {\n\t\t\t\tresult.version = engine.version;\n\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\tresult.major = String(coerce(engine.version)?.major ?? result.version);\n\t\t\t}\n\t\t}\n\n\t\t// Check if it is a bot and match it if so\n\t\t// Also treat Dalvik/ as a bot\n\t\tif (result.name !== \"Chrome Headless\" && isbot(this.userAgent)) {\n\t\t\tif (this.userAgent.includes(\"http://www.google.com/bot.htm\") || this.userAgent.includes(\"http://www.google.com/adsbot.htm\")) {\n\t\t\t\t// As far as we know, the last reported update to Googlebot was the intent\n\t\t\t\t// to keep it evergreen, but so far it seems 74 is the latest official version\n\t\t\t\tresult.name = \"Chrome\";\n\t\t\t\tresult.version = \"74\";\n\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\tresult.major = \"74\";\n\t\t\t}\n\n\t\t\t// Treat all other bots as IE 11\n\t\t\telse {\n\t\t\t\tresult.name = \"IE\";\n\t\t\t\tresult.version = \"11\";\n\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\tresult.major = \"11\";\n\t\t\t}\n\t\t}\n\n\t\tif (result[\"Sogou Explorer\"] != null) {\n\t\t\tresult.name = \"Sogou Explorer\";\n\t\t\tdelete result[\"Sogou Explorer\"];\n\t\t} else if (result.HeyTapBrowser != null) {\n\t\t\tresult.name = \"HeyTapBrowser\";\n\t\t\tdelete result.HeyTapBrowser;\n\t\t} else if (result[\"Samsung Browser\"] != null) {\n\t\t\tresult.name = \"Samsung Browser\";\n\t\t\tdelete result[\"Samsung Browser\"];\n\t\t} else if (result.WAP != null) {\n\t\t\tresult.name = \"IE\";\n\t\t\tresult.version = \"8\";\n\t\t\tdelete result.WAP;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Extends the result of calling 'getEngine'\n\t */\n\tprivate extendGetEngineResult(result: UseragentEngine): UseragentEngine {\n\t\tif (result.blink != null) {\n\t\t\tresult.name = \"Blink\";\n\t\t\tdelete result.blink;\n\t\t}\n\n\t\t// The User Agent may hold additional information, such as the equivalent Firefox version\n\t\tif (result.name === \"Goanna\") {\n\t\t\tconst ffMatch = this.userAgent.match(FIREFOX_MATCH);\n\t\t\tif (ffMatch != null) {\n\t\t\t\tresult.name = \"Gecko\";\n\t\t\t\tresult.version = ffMatch[1];\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Extends the result of calling 'getOS'\n\t */\n\tprivate extendGetOsResult(result: UseragentOs): UseragentOs {\n\t\tif (result.version != null && UNDERSCORED_VERSION_REGEX.test(result.version)) {\n\t\t\tresult.version = result.version.replace(/_/g, \".\");\n\t\t}\n\n\t\tif ((result.name == null || result.name === \"iOS\") && (IOS_REGEX_1.test(this.userAgent) || IOS_REGEX_2.test(this.userAgent))) {\n\t\t\tresult.name = \"iOS\";\n\n\t\t\tif (result.version == null) {\n\t\t\t\t// If it is the Facebook browser, the iOS version may be reported\n\t\t\t\t// through its FBSV/{version} part\n\t\t\t\tconst fbsvMatch = this.userAgent.match(FBSV_IOS_VERSION_REGEX);\n\t\t\t\tif (fbsvMatch != null) {\n\t\t\t\t\tresult.version = fbsvMatch[1].replace(/_/g, \".\");\n\t\t\t\t} else {\n\t\t\t\t\tconst iosRegex2Match = this.userAgent.match(IOS_REGEX_2);\n\t\t\t\t\tif (iosRegex2Match != null) {\n\t\t\t\t\t\tresult.version = iosRegex2Match[2].replace(/_/g, \".\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ((result.name == null || result.name === \"iOS\") && IOS_14_5_UA_1.test(this.userAgent)) {\n\t\t\tresult.name = \"iOS\";\n\t\t\tresult.version = \"14.5\";\n\t\t}\n\n\t\tif ((result.name == null || result.name === \"iOS\") && IOS_3_2_UA_1.test(this.userAgent)) {\n\t\t\tresult.name = \"iOS\";\n\t\t\tresult.version = \"3.2\";\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import Browserslist from \"browserslist\";\nimport { feature as caniuseFeature, features as caniuseFeatures } from \"caniuse-lite\";\nimport objectPath from \"object-path\";\nimport { gt, gte, lt, lte } from \"semver\";\nimport {\n\tgetClosestMatchingBrowserVersion,\n\tgetNextVersionOfBrowser,\n\tgetOldestVersionOfBrowser,\n\tgetPreviousVersionOfBrowser,\n\tgetSortedBrowserVersions,\n\tgetSortedBrowserVersionsWithLeadingVersion,\n\tnormalizeBrowserVersion\n} from \"./browser-version.js\";\nimport { UNKNOWN_CANIUSE_BROWSER } from \"./constant.js\";\nimport { ensureSemver, coerceToString } from \"./ensure-semver.js\";\nimport { compareVersions } from \"./compare-versions.js\";\nimport type { ComparisonOperator } from \"./comparison-operator.js\";\nimport type { EcmaVersion } from \"./ecma-version.js\";\nimport {\n\tES2015_FEATURES,\n\tES2016_FEATURES,\n\tES2017_FEATURES,\n\tES2018_FEATURES,\n\tES2019_FEATURES,\n\tES2020_FEATURES,\n\tES2021_FEATURES,\n\tES2022_FEATURES,\n\tES2023_FEATURES,\n\tES5_FEATURES\n} from \"./ecma-version.js\";\nimport { rangeCorrection } from \"./range-correction.js\";\nimport type { BrowserSupportForFeaturesCommonResult } from \"./browser-support-for-features-common-result.js\";\nimport type { CaniuseBrowser, CaniuseStats, CaniuseStatsNormalized, CaniuseBrowserCorrection, CaniuseFeature, VersionedCaniuseBrowser } from \"./i-caniuse.js\";\nimport { CaniuseSupportKind } from \"./i-caniuse.js\";\nimport type { Mdn, MdnBrowserName } from \"./mdn.js\";\nimport { NORMALIZE_BROWSER_VERSION_REGEXP } from \"./normalize-browser-version-regexp.js\";\nimport { UaParserWrapper } from \"./ua-parser-wrapper.js\";\nimport type { UseragentBrowser, UseragentEngine, UseragentOs } from \"./useragent/useragent-typed.js\";\n\n\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst compatData = require('@mdn/browser-compat-data');\n/**\n * A Cache between user agent names and generated Browserslists\n */\nconst userAgentToBrowserslistCache: Map<string, string[]> = new Map();\n\n/**\n * A Cache for retrieving browser support for some features\n */\nconst browserSupportForFeaturesCache: Map<string, BrowserSupportForFeaturesCommonResult> = new Map();\n\n/**\n * A Cache between feature names and their CaniuseStats\n */\nconst featureToCaniuseStatsCache: Map<string, CaniuseStatsNormalized> = new Map();\n\n/**\n * A Cache between user agents with any amount of features and whether or not they are supported by the user agent\n */\nconst userAgentWithFeaturesToSupportCache: Map<string, boolean> = new Map();\n\n/**\n * By and large, MDN has the best compat data, especially when looking into at which point older version of Android-based browsers\n * received support for a feature. Therefore we generally prioritize MDN compat data and will attempt to rewrite common caniuse queries to\n * their respective MDN feature names\n */\nconst CANIUSE_TO_MDN_FEATURE_MAP = {\n\tpointer: \"api.PointerEvent.PointerEvent\",\n\tshadowdomv1: \"api.ShadowRoot\",\n\t\"custom-elementsv1\": \"api.CustomElementRegistry\",\n\ttemplate: \"html.elements.template\",\n\tfetch: \"api.fetch\",\n\tpromises: \"javascript.builtins.Promise\",\n\t\"object-values\": \"javascript.builtins.Object.values\",\n\tmutationobserver: \"api.MutationObserver\",\n\t\"focusin-focusout-events\": \"api.Element.focusin_event\",\n\t\"high-resolution-time\": \"api.Performance.now\",\n\turl: \"api.URL\",\n\turlsearchparams: \"api.URLSearchParams\",\n\t\"object-fit\": \"css.properties.object-fit\",\n\t\"console-basic\": \"api.console.info\",\n\t\"console-time\": \"api.console.time\",\n\t\"atob-btoa\": \"api.atob\",\n\tblobbuilder: \"api.Blob.Blob\",\n\tbloburls: \"api.URL.createObjectURL\",\n\trequestidlecallback: \"api.Window.requestIdleCallback\",\n\trequestanimationframe: \"api.Window.requestAnimationFrame\",\n\tproxy: \"javascript.builtins.Proxy\"\n} as const;\n\n/**\n * A Map between features and browsers that has partial support for them but should be allowed anyway\n * @type {Map<string, string[]>}\n */\nconst PARTIAL_SUPPORT_ALLOWANCES = new Map([\n\t[\"shadowdomv1\", \"*\"],\n\t[\"custom-elementsv1\", \"*\"],\n\t[\"web-animation\", \"*\"]\n]) as Map<string, CaniuseBrowser[] | \"*\">;\n\nconst TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT: CaniuseBrowserCorrection = {\n\t/* eslint-disable @typescript-eslint/naming-convention */\n\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `4`),\n\tchrome: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `7`),\n\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `7`),\n\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, \"12\"),\n\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE, `4`),\n\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `12`),\n\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `12`),\n\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `4`),\n\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `4`),\n\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `6`),\n\tios_saf: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `5`),\n\tie: rangeCorrection(\"ie\", CaniuseSupportKind.AVAILABLE, `11`),\n\top_mini: rangeCorrection(\"op_mini\", CaniuseSupportKind.AVAILABLE, `all`),\n\tbb: rangeCorrection(\"bb\", CaniuseSupportKind.AVAILABLE, `10`),\n\tand_uc: rangeCorrection(\"and_uc\", CaniuseSupportKind.AVAILABLE, `11.8`),\n\tand_qq: rangeCorrection(\"and_qq\", CaniuseSupportKind.AVAILABLE, `1.2`),\n\tbaidu: rangeCorrection(\"baidu\", CaniuseSupportKind.AVAILABLE, `7.12`)\n\t/* eslint-enable @typescript-eslint/naming-convention */\n};\n\nconst TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT: CaniuseBrowserCorrection = {\n\t/* eslint-disable @typescript-eslint/naming-convention */\n\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `45`),\n\tchrome: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `45`),\n\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `45`),\n\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, \"12\"),\n\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE, `5`),\n\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `32`),\n\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `32`),\n\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `38`),\n\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `38`),\n\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\tios_saf: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\tie: rangeCorrection(\"ie\", CaniuseSupportKind.AVAILABLE, `11`),\n\tie_mob: rangeCorrection(\"ie\", CaniuseSupportKind.AVAILABLE, `11`)\n\t/* eslint-enable @typescript-eslint/naming-convention */\n};\n\nconst TYPED_ARRAY_ES2016_DATA_CORRECTIONS_INPUT: CaniuseBrowserCorrection = {\n\t/* eslint-disable @typescript-eslint/naming-convention */\n\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `47`),\n\tchrome: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `47`),\n\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `47`),\n\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, \"14\"),\n\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE, `5`),\n\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `34`),\n\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `34`),\n\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `43`),\n\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `43`),\n\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\tios_saf: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`)\n\t/* eslint-enable @typescript-eslint/naming-convention */\n};\n\nconst TYPED_ARRAY_KEYS_VALUES_ENTRIES_ITERATOR_DATA_CORRECTIONS_INPUT: CaniuseBrowserCorrection = {\n\t/* eslint-disable @typescript-eslint/naming-convention */\n\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `38`),\n\tchrome: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `38`),\n\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `38`),\n\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, \"12\"),\n\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE, `5`),\n\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `26`),\n\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `26`),\n\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `37`),\n\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `37`),\n\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\tios_saf: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`)\n\t/* eslint-enable @typescript-eslint/naming-convention */\n};\n\nconst TYPED_ARRAY_SPECIES_DATA_CORRECTIONS_INPUT: CaniuseBrowserCorrection = {\n\t/* eslint-disable @typescript-eslint/naming-convention */\n\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `51`),\n\tchrome: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `51`),\n\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `51`),\n\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, \"13\"),\n\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE, `5`),\n\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `38`),\n\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `38`),\n\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `48`),\n\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `48`),\n\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\tios_saf: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`)\n\t/* eslint-enable @typescript-eslint/naming-convention */\n};\n\n/**\n * Not all Caniuse data is entirely correct. For some features, the data on https://kangax.github.io/compat-table/es6/\n * is more correct. When a Browserslist is generated based on support for specific features, it is really important\n * that it is correct, especially if the browserslist will be used as an input to tools such as @babel/preset-env.\n * This table provides some corrections to the Caniuse data that makes it align better with actual availability\n * @type {[string, CaniuseBrowserCorrection][]}\n */\nconst FEATURE_TO_BROWSER_DATA_CORRECTIONS_INPUT: [string, CaniuseBrowserCorrection][] = [\n\t/* eslint-disable @typescript-eslint/naming-convention */\n\t[\n\t\t\"xhr2\",\n\t\t{\n\t\t\tie: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that XMLHttpRequest support is partial in Internet Explorer 11, but it is in fact properly supported\n\t\t\t\t\tkind: CaniuseSupportKind.AVAILABLE,\n\t\t\t\t\tversion: \"11\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t[\n\t\t// Caniuse reports that Safari 12.1 and iOS Safari 12.2 has partial support for Web Animations,\n\t\t// but they do not - They require enabling it as an experimental feature\n\t\t\"web-animation\",\n\t\t{\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.UNAVAILABLE, `0`, \"13.4\"),\n\t\t\tios_saf: rangeCorrection(\"ios_saf\", CaniuseSupportKind.UNAVAILABLE, `0`, \"13.4\")\n\t\t}\n\t],\n\t[\n\t\t\"es6-class\",\n\t\t{\n\t\t\tedge: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that Microsoft Edge has been supporting classes since v12, but it was prefixed until v13\n\t\t\t\t\tkind: CaniuseSupportKind.PREFIXED,\n\t\t\t\t\tversion: \"12\"\n\t\t\t\t}\n\t\t\t],\n\t\t\tios_saf: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that iOS Safari has been supporting classes since v9, but the implementation was only partial\n\t\t\t\t\tkind: CaniuseSupportKind.PARTIAL_SUPPORT,\n\t\t\t\t\tversion: \"9\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that iOS Safari has been supporting classes since v9, but the implementation was only partial\n\t\t\t\t\tkind: CaniuseSupportKind.PARTIAL_SUPPORT,\n\t\t\t\t\tversion: \"9.2\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that iOS Safari has been supporting classes since v9, but the implementation was only partial\n\t\t\t\t\tkind: CaniuseSupportKind.PARTIAL_SUPPORT,\n\t\t\t\t\tversion: \"9.3\"\n\t\t\t\t}\n\t\t\t],\n\t\t\tsafari: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that Safari has been supporting classes since v9, but the implementation was only partial\n\t\t\t\t\tkind: CaniuseSupportKind.PARTIAL_SUPPORT,\n\t\t\t\t\tversion: \"9\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that Safari has been supporting classes since v9, but the implementation was only partial\n\t\t\t\t\tkind: CaniuseSupportKind.PARTIAL_SUPPORT,\n\t\t\t\t\tversion: \"9.1\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t[\n\t\t\"api.Element.classList\",\n\t\t{\n\t\t\tedge: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that Microsoft Edge v15 has only partial support for class-list since it doesn't support SVG elements,\n\t\t\t\t\t// but we don't want feature detections to return false for that browser\n\t\t\t\t\tkind: CaniuseSupportKind.AVAILABLE,\n\t\t\t\t\tversion: \"15\"\n\t\t\t\t}\n\t\t\t],\n\t\t\tie: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that IE 10 has only partial support for class-list since it doesn't support SVG elements,\n\t\t\t\t\t// but we don't want feature detections to return false for that browser\n\t\t\t\t\tkind: CaniuseSupportKind.AVAILABLE,\n\t\t\t\t\tversion: \"10\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that IE 11 has only partial support for class-list since it doesn't support SVG elements,\n\t\t\t\t\t// but we don't want feature detections to return false for that browser\n\t\t\t\t\tkind: CaniuseSupportKind.AVAILABLE,\n\t\t\t\t\tversion: \"11\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t[\"javascript.builtins.TypedArray.from\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.of\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.subarray\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.copyWithin\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.every\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.fill\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.filter\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.find\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.findIndex\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.forEach\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.indexOf\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.join\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.lastIndexOf\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.map\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.reduce\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.reduceRight\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.reverse\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.some\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.sort\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.toLocaleString\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.toString\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.slice\", TYPED_ARRAY_ES2015_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.includes\", TYPED_ARRAY_ES2016_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.keys\", TYPED_ARRAY_KEYS_VALUES_ENTRIES_ITERATOR_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.values\", TYPED_ARRAY_KEYS_VALUES_ENTRIES_ITERATOR_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.entries\", TYPED_ARRAY_KEYS_VALUES_ENTRIES_ITERATOR_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.@@iterator\", TYPED_ARRAY_KEYS_VALUES_ENTRIES_ITERATOR_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray.@@species\", TYPED_ARRAY_SPECIES_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.TypedArray\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Int8Array\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Int16Array\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Int32Array\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Float32Array\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Float64Array\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Uint8Array\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Uint8ClampedArray\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Uint16ClampedArray\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\"javascript.builtins.Uint32ClampedArray\", TYPED_ARRAY_BASE_DATA_CORRECTIONS_INPUT],\n\t[\n\t\t\"javascript.builtins.String.@@iterator\",\n\t\t{\n\t\t\tandroid: rangeCorrection(\"chrome\", CaniuseSupportKind.AVAILABLE, `38`),\n\t\t\tchrome: rangeCorrection(\"chrome\", CaniuseSupportKind.AVAILABLE, `38`),\n\t\t\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `38`),\n\t\t\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, `12`),\n\t\t\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `25`),\n\t\t\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `25`),\n\t\t\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `36`),\n\t\t\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `36`),\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `9`),\n\t\t\tios_saf: rangeCorrection(\"ios_saf\", CaniuseSupportKind.AVAILABLE, `9`),\n\t\t\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE, `3`)\n\t\t}\n\t],\n\t[\n\t\t\"javascript.builtins.Symbol.asyncIterator\",\n\t\t{\n\t\t\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `63`),\n\t\t\tchrome: rangeCorrection(\"chrome\", CaniuseSupportKind.AVAILABLE, `63`),\n\t\t\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `63`),\n\t\t\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `50`),\n\t\t\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `50`),\n\t\t\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `57`),\n\t\t\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `57`),\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `11.1`),\n\t\t\tios_saf: rangeCorrection(\"ios_saf\", CaniuseSupportKind.AVAILABLE, `11.1`)\n\t\t}\n\t],\n\t[\n\t\t\"javascript.builtins.Array.@@species\",\n\t\t{\n\t\t\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `51`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Chrome v51\n\t\t\tchrome: rangeCorrection(\"chrome\", CaniuseSupportKind.AVAILABLE, `51`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Chrome for Android v51\n\t\t\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `51`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Edge v14\n\t\t\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE, `14`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Firefox v41\n\t\t\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `41`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Firefox for Android v41\n\t\t\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `41`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Opera v38\n\t\t\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `38`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Opera for Android v38\n\t\t\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `38`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Safari v10\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\t\t\t// MDN reports that it doesn't support Array.@@species, but it does and has done since Safari for iOS v10\n\t\t\tios_saf: rangeCorrection(\"ios_saf\", CaniuseSupportKind.AVAILABLE, `10`)\n\t\t}\n\t],\n\t[\n\t\t\"javascript.builtins.Date.@@toPrimitive\",\n\t\t{\n\t\t\tandroid: rangeCorrection(\"android\", CaniuseSupportKind.AVAILABLE, `48`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Chrome v48\n\t\t\tchrome: rangeCorrection(\"chrome\", CaniuseSupportKind.AVAILABLE, `48`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Chrome for Android v48\n\t\t\tand_chr: rangeCorrection(\"and_chr\", CaniuseSupportKind.AVAILABLE, `48`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done in all Edge versions\n\t\t\tedge: rangeCorrection(\"edge\", CaniuseSupportKind.AVAILABLE),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Firefox v44\n\t\t\tfirefox: rangeCorrection(\"firefox\", CaniuseSupportKind.AVAILABLE, `44`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Firefox for Android v44\n\t\t\tand_ff: rangeCorrection(\"and_ff\", CaniuseSupportKind.AVAILABLE, `44`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Opera v35\n\t\t\topera: rangeCorrection(\"opera\", CaniuseSupportKind.AVAILABLE, `35`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Opera for Android v35\n\t\t\top_mob: rangeCorrection(\"op_mob\", CaniuseSupportKind.AVAILABLE, `35`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Safari v10\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.AVAILABLE, `10`),\n\t\t\t// MDN reports that it doesn't support Date.@@toPrimitive, but it does and has done since Safari for iOS v10\n\t\t\tios_saf: rangeCorrection(\"ios_saf\", CaniuseSupportKind.AVAILABLE, `10`),\n\t\t\t// MDN reports that it doesn't support the Date.@@toPrimitive method, but it does and has done for all Samsung Internet versions\n\t\t\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.AVAILABLE)\n\t\t}\n\t],\n\t[\n\t\t\"fetch\",\n\t\t{\n\t\t\tedge: [\n\t\t\t\t{\n\t\t\t\t\t// Caniuse reports that Microsoft Edge has been supporting fetch since v14, but the implementation was quite unstable until v15\n\t\t\t\t\tkind: CaniuseSupportKind.UNAVAILABLE,\n\t\t\t\t\tversion: \"14\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t[\n\t\t\"api.Window\",\n\t\t{\n\t\t\tchrome: rangeCorrection(\"chrome\", CaniuseSupportKind.UNAVAILABLE, `0`, `18`),\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.UNAVAILABLE, `0`, `5.1`),\n\t\t\tie: rangeCorrection(\"ie\", CaniuseSupportKind.UNAVAILABLE, `0`, `7`),\n\t\t\topera: rangeCorrection(\"safari\", CaniuseSupportKind.UNAVAILABLE, `0`, `11.1`)\n\t\t}\n\t],\n\t[\n\t\t\"javascript.builtins.String.matchAll\",\n\t\t{\n\t\t\tsamsung: rangeCorrection(\"samsung\", CaniuseSupportKind.UNAVAILABLE, `0`, `9.4`)\n\t\t}\n\t],\n\t[\n\t\t\"resizeobserver\",\n\t\t{\n\t\t\tsafari: rangeCorrection(\"safari\", CaniuseSupportKind.UNAVAILABLE, `0`)\n\t\t}\n\t]\n\t/* eslint-enable @typescript-eslint/naming-convention */\n];\n\n/**\n * A Map between caniuse features and corrections to apply (see above)\n * @type {Map<string, CaniuseBrowserCorrection>}\n */\nconst FEATURE_TO_BROWSER_DATA_CORRECTIONS_MAP: Map<string, CaniuseBrowserCorrection> = new Map(FEATURE_TO_BROWSER_DATA_CORRECTIONS_INPUT);\n\n/**\n * Returns the input query, but extended with the given options\n */\nfunction extendQueryWith(query: string[], extendWith: string | string[]): string[] {\n\tconst normalizedExtendWith = Array.isArray(extendWith) ? extendWith : [extendWith];\n\treturn [...new Set([...query, ...normalizedExtendWith])];\n}\n\n/**\n * Normalizes the given Browserslist\n */\nexport function normalizeBrowserslist(browserslist: string | string[]): string[] {\n\tconst result = Browserslist(browserslist);\n\n\t// Caniuse only tracks the latest Browser version for Android-based browsers,\n\t// so we'll need to add the relevant details back in after normalizing the Browserslist\n\t// to make sure comparsions won't fail\n\tconst inputBrowserslist = Array.isArray(browserslist) ? browserslist : [browserslist];\n\n\tfor (const browser of [\"and_ff\", \"and_chr\", \"and_uc\", \"and_qq\", \"baidu\", \"op_mini\"] as const) {\n\t\tconst versions = getSortedBrowserVersions(browser);\n\t\tfor (const entry of inputBrowserslist) {\n\t\t\tif (!entry.startsWith(browser)) continue;\n\t\t\tconst directMatch = entry.match(new RegExp(`${browser} (\\\\d+.*)`));\n\t\t\tif (directMatch != null) {\n\t\t\t\tconst candidate = `${browser} ${directMatch[1]}`;\n\t\t\t\tif (!result.includes(candidate)) {\n\t\t\t\t\tresult.push(candidate);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst greaterThanOrEqualsMatch = entry.match(new RegExp(`${browser} >= (\\\\d+)`));\n\n\t\t\t\tif (greaterThanOrEqualsMatch != null) {\n\t\t\t\t\tlet currentMajor = Number(greaterThanOrEqualsMatch[1]);\n\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst candidate = `${browser} ${currentMajor}`;\n\t\t\t\t\t\tif (!result.includes(candidate)) {\n\t\t\t\t\t\t\tresult.push(candidate);\n\t\t\t\t\t\t\tcurrentMajor++;\n\t\t\t\t\t\t\tif (Number(getClosestMatchingBrowserVersion(browser, String(currentMajor), versions)) <= currentMajor) break;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result.sort();\n}\n\n/**\n * Returns the input query, but extended with 'unreleased versions'\n */\nfunction extendQueryWithUnreleasedVersions(query: string[], browsers: Iterable<CaniuseBrowser>): string[] {\n\treturn extendQueryWith(\n\t\tquery,\n\t\tArray.from(browsers).map(browser => `unreleased ${browser} versions`)\n\t);\n}\n\n/**\n * Generates a Browserslist based on browser support for the given features\n */\nexport function browsersWithSupportForFeatures(...features: string[]): string[] {\n\tconst { query, browsers } = browserSupportForFeaturesCommon(\">=\", ...features);\n\treturn extendQueryWithUnreleasedVersions(query, browsers);\n}\n\n/**\n * Returns true if the given Browserslist supports the given EcmaVersion\n */\nexport function browserslistSupportsEcmaVersion(browserslist: string[], version: EcmaVersion): boolean {\n\tswitch (version) {\n\t\tcase \"es3\":\n\t\t\t// ES