update, text, response
This commit is contained in:
187
node_modules/browserslist/index.js
generated
vendored
187
node_modules/browserslist/index.js
generated
vendored
@@ -1,12 +1,13 @@
|
||||
var bbm = require('baseline-browser-mapping')
|
||||
var jsReleases = require('node-releases/data/processed/envs.json')
|
||||
var agents = require('caniuse-lite/dist/unpacker/agents').agents
|
||||
var e2c = require('electron-to-chromium/versions')
|
||||
var jsEOL = require('node-releases/data/release-schedule/release-schedule.json')
|
||||
var path = require('path')
|
||||
var e2c = require('electron-to-chromium/versions')
|
||||
|
||||
var BrowserslistError = require('./error')
|
||||
var parse = require('./parse')
|
||||
var env = require('./node') // Will load browser.js in webpack
|
||||
var env = require('./node')
|
||||
var parseWithoutCache = require('./parse') // Will load browser.js in webpack
|
||||
|
||||
var YEAR = 365.259641 * 24 * 60 * 60 * 1000
|
||||
var ANDROID_EVERGREEN_FIRST = '37'
|
||||
@@ -82,11 +83,11 @@ function generateFilter(sign, version) {
|
||||
version = parseFloat(version)
|
||||
if (sign === '>') {
|
||||
return function (v) {
|
||||
return parseFloat(v) > version
|
||||
return parseLatestFloat(v) > version
|
||||
}
|
||||
} else if (sign === '>=') {
|
||||
return function (v) {
|
||||
return parseFloat(v) >= version
|
||||
return parseLatestFloat(v) >= version
|
||||
}
|
||||
} else if (sign === '<') {
|
||||
return function (v) {
|
||||
@@ -97,6 +98,10 @@ function generateFilter(sign, version) {
|
||||
return parseFloat(v) <= version
|
||||
}
|
||||
}
|
||||
|
||||
function parseLatestFloat(v) {
|
||||
return parseFloat(v.split('-')[1] || v)
|
||||
}
|
||||
}
|
||||
|
||||
function generateSemverFilter(sign, version) {
|
||||
@@ -249,9 +254,18 @@ function normalizeAndroidVersions(androidVersions, chromeVersions) {
|
||||
.concat(chromeVersions.slice(iFirstEvergreen))
|
||||
}
|
||||
|
||||
function copyObject(obj) {
|
||||
var copy = {}
|
||||
for (var key in obj) {
|
||||
copy[key] = obj[key]
|
||||
}
|
||||
return copy
|
||||
}
|
||||
|
||||
function normalizeAndroidData(android, chrome) {
|
||||
android.released = normalizeAndroidVersions(android.released, chrome.released)
|
||||
android.versions = normalizeAndroidVersions(android.versions, chrome.versions)
|
||||
android.releaseDate = copyObject(android.releaseDate)
|
||||
android.released.forEach(function (v) {
|
||||
if (android.releaseDate[v] === undefined) {
|
||||
android.releaseDate[v] = chrome.releaseDate[v]
|
||||
@@ -298,15 +312,15 @@ function filterJumps(list, name, nVersions, context) {
|
||||
return list.slice(jump - 1 - nVersions)
|
||||
}
|
||||
|
||||
function isSupported(flags) {
|
||||
function isSupported(flags, withPartial) {
|
||||
return (
|
||||
typeof flags === 'string' &&
|
||||
(flags.indexOf('y') >= 0 || flags.indexOf('a') >= 0)
|
||||
(flags.indexOf('y') >= 0 || (withPartial && flags.indexOf('a') >= 0))
|
||||
)
|
||||
}
|
||||
|
||||
function resolve(queries, context) {
|
||||
return parse(QUERIES, queries).reduce(function (result, node, index) {
|
||||
return parseQueries(queries).reduce(function (result, node, index) {
|
||||
if (node.not && index === 0) {
|
||||
throw new BrowserslistError(
|
||||
'Write any browsers query (for instance, `defaults`) ' +
|
||||
@@ -382,19 +396,27 @@ function checkQueries(queries) {
|
||||
}
|
||||
|
||||
var cache = {}
|
||||
var parseCache = {}
|
||||
|
||||
function browserslist(queries, opts) {
|
||||
opts = prepareOpts(opts)
|
||||
queries = prepareQueries(queries, opts)
|
||||
checkQueries(queries)
|
||||
|
||||
var needsPath = parseQueries(queries).some(function (node) {
|
||||
return QUERIES[node.type].needsPath
|
||||
})
|
||||
var context = {
|
||||
ignoreUnknownVersions: opts.ignoreUnknownVersions,
|
||||
dangerousExtend: opts.dangerousExtend,
|
||||
throwOnMissing: opts.throwOnMissing,
|
||||
mobileToDesktop: opts.mobileToDesktop,
|
||||
path: opts.path,
|
||||
env: opts.env
|
||||
}
|
||||
// Removing to avoid using context.path without marking query as needsPath
|
||||
if (needsPath) {
|
||||
context.path = opts.path
|
||||
}
|
||||
|
||||
env.oldDataWarning(browserslist.data)
|
||||
var stats = env.getStat(opts, browserslist.data)
|
||||
@@ -428,11 +450,35 @@ function browserslist(queries, opts) {
|
||||
return result
|
||||
}
|
||||
|
||||
function parseQueries(queries) {
|
||||
var cacheKey = JSON.stringify(queries)
|
||||
if (cacheKey in parseCache) return parseCache[cacheKey]
|
||||
var result = parseWithoutCache(QUERIES, queries)
|
||||
if (!env.env.BROWSERSLIST_DISABLE_CACHE) {
|
||||
parseCache[cacheKey] = result
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function loadCustomUsage(context, config) {
|
||||
var stats = env.loadStat(context, config, browserslist.data)
|
||||
if (stats) {
|
||||
context.customUsage = {}
|
||||
for (var browser in stats) {
|
||||
fillUsage(context.customUsage, browser, stats[browser])
|
||||
}
|
||||
}
|
||||
if (!context.customUsage) {
|
||||
throw new BrowserslistError('Custom usage statistics was not provided')
|
||||
}
|
||||
return context.customUsage
|
||||
}
|
||||
|
||||
browserslist.parse = function (queries, opts) {
|
||||
opts = prepareOpts(opts)
|
||||
queries = prepareQueries(queries, opts)
|
||||
checkQueries(queries)
|
||||
return parse(QUERIES, queries)
|
||||
return parseQueries(queries)
|
||||
}
|
||||
|
||||
// Will be filled by Can I Use data below
|
||||
@@ -478,6 +524,7 @@ browserslist.versionAliases = {}
|
||||
browserslist.clearCaches = env.clearCaches
|
||||
browserslist.parseConfig = env.parseConfig
|
||||
browserslist.readConfig = env.readConfig
|
||||
browserslist.findConfigFile = env.findConfigFile
|
||||
browserslist.findConfig = env.findConfig
|
||||
browserslist.loadConfig = env.loadConfig
|
||||
|
||||
@@ -548,6 +595,33 @@ function sinceQuery(context, node) {
|
||||
return filterByYear(Date.UTC(year, month, day, 0, 0, 0), context)
|
||||
}
|
||||
|
||||
function bbmTransform(bbmVersions) {
|
||||
var browsers = {
|
||||
chrome: 'chrome',
|
||||
chrome_android: 'and_chr',
|
||||
edge: 'edge',
|
||||
firefox: 'firefox',
|
||||
firefox_android: 'and_ff',
|
||||
safari: 'safari',
|
||||
safari_ios: 'ios_saf',
|
||||
webview_android: 'android',
|
||||
samsunginternet_android: 'samsung',
|
||||
opera_android: 'op_mob',
|
||||
opera: 'opera',
|
||||
qq_android: 'and_qq',
|
||||
uc_android: 'and_uc',
|
||||
kai_os: 'kaios'
|
||||
}
|
||||
|
||||
return bbmVersions
|
||||
.filter(function (version) {
|
||||
return Object.keys(browsers).indexOf(version.browser) !== -1
|
||||
})
|
||||
.map(function (version) {
|
||||
return browsers[version.browser] + ' >= ' + version.version
|
||||
})
|
||||
}
|
||||
|
||||
function coverQuery(context, node) {
|
||||
var coverage = parseFloat(node.coverage)
|
||||
var usage = browserslist.usage.global
|
||||
@@ -567,19 +641,21 @@ function coverQuery(context, node) {
|
||||
env.loadCountry(browserslist.usage, place, browserslist.data)
|
||||
usage = browserslist.usage[place]
|
||||
}
|
||||
} else if (node.config) {
|
||||
usage = loadCustomUsage(context, node.config)
|
||||
}
|
||||
var versions = Object.keys(usage).sort(function (a, b) {
|
||||
return usage[b] - usage[a]
|
||||
})
|
||||
var coveraged = 0
|
||||
var covered = 0
|
||||
var result = []
|
||||
var version
|
||||
for (var i = 0; i < versions.length; i++) {
|
||||
version = versions[i]
|
||||
if (usage[version] === 0) break
|
||||
coveraged += usage[version]
|
||||
covered += usage[version]
|
||||
result.push(version)
|
||||
if (coveraged >= coverage) break
|
||||
if (covered >= coverage) break
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -713,7 +789,7 @@ var QUERIES = {
|
||||
},
|
||||
last_years: {
|
||||
matches: ['years'],
|
||||
regexp: /^last\s+(\d*.?\d+)\s+years?$/i,
|
||||
regexp: /^last\s+((\d+\.)?\d+)\s+years?$/i,
|
||||
select: function (context, node) {
|
||||
return filterByYear(Date.now() - YEAR * node.years, context)
|
||||
}
|
||||
@@ -733,6 +809,54 @@ var QUERIES = {
|
||||
regexp: /^since (\d+)-(\d+)-(\d+)$/i,
|
||||
select: sinceQuery
|
||||
},
|
||||
baseline: {
|
||||
matches: ['year', 'availability', 'date', 'downstream', 'kaios'],
|
||||
// Matches:
|
||||
// baseline 2024
|
||||
// baseline newly available
|
||||
// baseline widely available
|
||||
// baseline widely available on 2024-06-01
|
||||
// ...with downstream
|
||||
// ...including kaios
|
||||
regexp:
|
||||
/^baseline\s+(?:(\d+)|(newly|widely)\s+available(?:\s+on\s+(\d{4}-\d{2}-\d{2}))?)?(\s+with\s+downstream)?(\s+including\s+kaios)?$/i,
|
||||
select: function (context, node) {
|
||||
var baselineVersions
|
||||
var includeDownstream = !!node.downstream
|
||||
var includeKaiOS = !!node.kaios
|
||||
if (node.availability === 'newly' && node.date) {
|
||||
throw new BrowserslistError(
|
||||
'Using newly available with a date is not supported, please use "widely available on YYYY-MM-DD" and add 30 months to the date you specified.'
|
||||
)
|
||||
}
|
||||
if (node.year) {
|
||||
baselineVersions = bbm.getCompatibleVersions({
|
||||
targetYear: node.year,
|
||||
includeDownstreamBrowsers: includeDownstream,
|
||||
includeKaiOS: includeKaiOS
|
||||
})
|
||||
} else if (node.date) {
|
||||
baselineVersions = bbm.getCompatibleVersions({
|
||||
widelyAvailableOnDate: node.date,
|
||||
includeDownstreamBrowsers: includeDownstream,
|
||||
includeKaiOS: includeKaiOS
|
||||
})
|
||||
} else if (node.availability === 'newly') {
|
||||
var future30months = new Date().setMonth(new Date().getMonth() + 30)
|
||||
baselineVersions = bbm.getCompatibleVersions({
|
||||
widelyAvailableOnDate: future30months,
|
||||
includeDownstreamBrowsers: includeDownstream,
|
||||
includeKaiOS: includeKaiOS
|
||||
})
|
||||
} else {
|
||||
baselineVersions = bbm.getCompatibleVersions({
|
||||
includeDownstreamBrowsers: includeDownstream,
|
||||
includeKaiOS: includeKaiOS
|
||||
})
|
||||
}
|
||||
return resolve(bbmTransform(baselineVersions), context)
|
||||
}
|
||||
},
|
||||
popularity: {
|
||||
matches: ['sign', 'popularity'],
|
||||
regexp: /^(>=?|<=?)\s*(\d+|\d+\.\d+|\.\d+)%$/,
|
||||
@@ -798,17 +922,7 @@ var QUERIES = {
|
||||
regexp: /^(>=?|<=?)\s*(\d+|\d+\.\d+|\.\d+)%\s+in\s+(\S+)\s+stats$/,
|
||||
select: function (context, node) {
|
||||
var popularity = parseFloat(node.popularity)
|
||||
var stats = env.loadStat(context, node.config, browserslist.data)
|
||||
if (stats) {
|
||||
context.customUsage = {}
|
||||
for (var browser in stats) {
|
||||
fillUsage(context.customUsage, browser, stats[browser])
|
||||
}
|
||||
}
|
||||
if (!context.customUsage) {
|
||||
throw new BrowserslistError('Custom usage statistics was not provided')
|
||||
}
|
||||
var usage = context.customUsage
|
||||
var usage = loadCustomUsage(context, node.config)
|
||||
return Object.keys(usage).reduce(function (result, version) {
|
||||
var percentage = usage[version]
|
||||
if (percentage == null) {
|
||||
@@ -882,26 +996,37 @@ var QUERIES = {
|
||||
regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)$/i,
|
||||
select: coverQuery
|
||||
},
|
||||
cover_config: {
|
||||
matches: ['coverage', 'config'],
|
||||
regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(\S+)\s+stats$/i,
|
||||
select: coverQuery
|
||||
},
|
||||
supports: {
|
||||
matches: ['feature'],
|
||||
regexp: /^supports\s+([\w-]+)$/,
|
||||
matches: ['supportType', 'feature'],
|
||||
regexp: /^(?:(fully|partially)\s+)?supports\s+([\w-]+)$/,
|
||||
select: function (context, node) {
|
||||
env.loadFeature(browserslist.cache, node.feature)
|
||||
var withPartial = node.supportType !== 'fully'
|
||||
var features = browserslist.cache[node.feature]
|
||||
var result = []
|
||||
for (var name in features) {
|
||||
var data = byName(name, context)
|
||||
// Only check desktop when latest released mobile has support
|
||||
var iMax = data.released.length - 1
|
||||
while (iMax >= 0) {
|
||||
if (data.released[iMax] in features[name]) break
|
||||
iMax--
|
||||
}
|
||||
var checkDesktop =
|
||||
context.mobileToDesktop &&
|
||||
name in browserslist.desktopNames &&
|
||||
isSupported(features[name][data.released.slice(-1)[0]])
|
||||
isSupported(features[name][data.released[iMax]], withPartial)
|
||||
data.versions.forEach(function (version) {
|
||||
var flags = features[name][version]
|
||||
if (flags === undefined && checkDesktop) {
|
||||
flags = features[browserslist.desktopNames[name]][version]
|
||||
}
|
||||
if (isSupported(flags)) {
|
||||
if (isSupported(flags, withPartial)) {
|
||||
result.push(name + ' ' + version)
|
||||
}
|
||||
})
|
||||
@@ -1001,7 +1126,7 @@ var QUERIES = {
|
||||
matches: [],
|
||||
regexp: /^(firefox|ff|fx)\s+esr$/i,
|
||||
select: function () {
|
||||
return ['firefox 102', 'firefox 115']
|
||||
return ['firefox 140']
|
||||
}
|
||||
},
|
||||
opera_mini_all: {
|
||||
@@ -1113,6 +1238,7 @@ var QUERIES = {
|
||||
browserslist_config: {
|
||||
matches: [],
|
||||
regexp: /^browserslist config$/i,
|
||||
needsPath: true,
|
||||
select: function (context) {
|
||||
return browserslist(undefined, context)
|
||||
}
|
||||
@@ -1120,6 +1246,7 @@ var QUERIES = {
|
||||
extends: {
|
||||
matches: ['config'],
|
||||
regexp: /^extends (.+)$/i,
|
||||
needsPath: true,
|
||||
select: function (context, node) {
|
||||
return resolve(env.loadQueries(context, node.config), context)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user