Skip to content

Commit

Permalink
Fix invalid results for Opera Mobile (#768)
Browse files Browse the repository at this point in the history
  • Loading branch information
steverep committed Jun 14, 2023
1 parent d05ffab commit 9f595d6
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 56 deletions.
64 changes: 25 additions & 39 deletions index.js
Expand Up @@ -10,6 +10,7 @@ var env = require('./node') // Will load browser.js in webpack

var YEAR = 365.259641 * 24 * 60 * 60 * 1000
var ANDROID_EVERGREEN_FIRST = '37'
var OP_MOB_BLINK_FIRST = 14

// Helpers

Expand Down Expand Up @@ -223,21 +224,6 @@ function cloneData(data) {
}
}

function mapVersions(data, map) {
data.versions = data.versions.map(function (i) {
return map[i] || i
})
data.released = data.released.map(function (i) {
return map[i] || i
})
var fixedDate = {}
for (var i in data.releaseDate) {
fixedDate[map[i] || i] = data.releaseDate[i]
}
data.releaseDate = fixedDate
return data
}

function byName(name, context) {
name = name.toLowerCase()
name = browserslist.aliases[name] || name
Expand All @@ -248,9 +234,6 @@ function byName(name, context) {
} else {
var cloned = cloneData(desktop)
cloned.name = name
if (name === 'op_mob') {
cloned = mapVersions(cloned, { '10.0-10.1': '10' })
}
return cloned
}
}
Expand Down Expand Up @@ -292,14 +275,27 @@ function unknownQuery(query) {
)
}

function filterAndroid(list, versions, context) {
if (context.mobileToDesktop) return list
var released = browserslist.data.chrome.released
var nEvergreen = released.length - released.indexOf(ANDROID_EVERGREEN_FIRST)
if (versions <= nEvergreen) {
// Adjusts last X versions queries for some mobile browsers,
// where caniuse data jumps from a legacy version to the latest
function filterJumps(list, name, nVersions, context) {
var jump = 1
switch (name) {
case 'android':
if (context.mobileToDesktop) return list
var released = browserslist.data.chrome.released
jump = released.length - released.indexOf(ANDROID_EVERGREEN_FIRST)
break
case 'op_mob':
var latest = browserslist.data.op_mob.released.slice(-1)[0]
jump = getMajor(latest) - OP_MOB_BLINK_FIRST + 1
break
default:
return list
}
if (nVersions <= jump) {
return list.slice(-1)
}
return list.slice(nEvergreen - 1 - versions)
return list.slice(jump - 1 - nVersions)
}

function isSupported(flags) {
Expand Down Expand Up @@ -468,11 +464,11 @@ browserslist.aliases = {

// Can I Use only provides a few versions for some browsers (e.g. and_chr).
// Fallback to a similar browser for unknown versions
// Note op_mob is not included as its chromium versions are not in sync with Opera desktop
browserslist.desktopNames = {
and_chr: 'chrome',
and_ff: 'firefox',
ie_mob: 'ie',
op_mob: 'opera',
android: 'chrome' // has extra processing logic
}

Expand Down Expand Up @@ -598,9 +594,7 @@ var QUERIES = {
if (!data) return selected
var list = getMajorVersions(data.released, node.versions)
list = list.map(nameMapper(data.name))
if (data.name === 'android') {
list = filterAndroid(list, node.versions, context)
}
list = filterJumps(list, data.name, node.versions, context)
return selected.concat(list)
}, [])
}
Expand All @@ -614,9 +608,7 @@ var QUERIES = {
if (!data) return selected
var list = data.released.slice(-node.versions)
list = list.map(nameMapper(data.name))
if (data.name === 'android') {
list = filterAndroid(list, node.versions, context)
}
list = filterJumps(list, data.name, node.versions, context)
return selected.concat(list)
}, [])
}
Expand Down Expand Up @@ -649,9 +641,7 @@ var QUERIES = {
var data = checkName(node.browser, context)
var validVersions = getMajorVersions(data.released, node.versions)
var list = validVersions.map(nameMapper(data.name))
if (data.name === 'android') {
list = filterAndroid(list, node.versions, context)
}
list = filterJumps(list, data.name, node.versions, context)
return list
}
},
Expand Down Expand Up @@ -683,9 +673,7 @@ var QUERIES = {
select: function (context, node) {
var data = checkName(node.browser, context)
var list = data.released.slice(-node.versions).map(nameMapper(data.name))
if (data.name === 'android') {
list = filterAndroid(list, node.versions, context)
}
list = filterJumps(list, data.name, node.versions, context)
return list
}
},
Expand Down Expand Up @@ -1200,8 +1188,6 @@ var QUERIES = {
}
}

browserslist.versionAliases.op_mob['59'] = '58'

browserslist.nodeVersions = jsReleases.map(function (release) {
return release.version
})
Expand Down
1 change: 0 additions & 1 deletion test/direct.test.js
Expand Up @@ -57,7 +57,6 @@ test('supports Can I Use missing mobile versions', () => {
equal(browserslist('chromeandroid 53', opts), ['and_chr 53'])
equal(browserslist('and_ff 60', opts), ['and_ff 60'])
equal(browserslist('ie_mob 9', opts), ['ie_mob 9'])
equal(browserslist('op_mob 30', opts), ['op_mob 30'])
equal(browserslist('chromeandroid >= 52 and chromeandroid < 54', opts), [
'and_chr 53',
'and_chr 52'
Expand Down
35 changes: 19 additions & 16 deletions test/last.test.js
Expand Up @@ -49,6 +49,12 @@ test.before.each(() => {
released: ['85', '86'],
versions: ['85', '86', '87'],
releaseDate: {}
},
op_mob: {
name: 'op_mob',
released: ['12', '12.1', '17'],
versions: [],
releaseDate: {}
}
}
})
Expand All @@ -68,36 +74,33 @@ test('selects versions of each browser', () => {
'edge 12',
'ie 11',
'ie 10',
'op_mob 17',
'opera 86',
'opera 85'
])
})

test('has special logic for android', () => {
equal(browserslist('last 4 versions'), [
test('Properly handles Android version jump', () => {
equal(browserslist('last 3 android versions'), ['android 39'])
equal(browserslist('last 4 android versions'), [
'android 39',
'android 4.4.3-4.4.4',
'bb 8',
'chrome 39',
'chrome 38',
'chrome 37',
'chrome 36',
'edge 12',
'ie 11',
'ie 10',
'ie 9',
'opera 86',
'opera 85'
'android 4.4.3-4.4.4'
])
})

test('Properly handles Opera Mobile version jump', () => {
equal(browserslist('last 4 op_mob versions'), ['op_mob 17'])
equal(browserslist('last 5 op_mob versions'), ['op_mob 17', 'op_mob 12.1'])
})

test('supports pluralization', () => {
equal(browserslist('last 1 version'), [
'android 39',
'bb 8',
'chrome 39',
'edge 12',
'ie 11',
'op_mob 17',
'opera 86'
])
})
Expand All @@ -109,6 +112,7 @@ test('is case insensitive', () => {
'chrome 39',
'edge 12',
'ie 11',
'op_mob 17',
'opera 86'
])
})
Expand All @@ -127,8 +131,7 @@ test('excludes unreleased versions if enabling mobile to desktop', () => {
'ie 10',
'ie_mob 11',
'ie_mob 10',
'op_mob 86',
'op_mob 85',
'op_mob 17',
'opera 86',
'opera 85'
])
Expand Down

0 comments on commit 9f595d6

Please sign in to comment.