Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added caniuse-lite browsers release date check #267

Merged
merged 5 commits into from
Jun 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions __mocks__/fs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = jest.genMockFromModule('fs') // eslint-disable-line
4 changes: 3 additions & 1 deletion browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@ module.exports = {

findConfig: noop,

clearCaches: noop
clearCaches: noop,

checkCanIUse: noop
}
1 change: 1 addition & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ function browserslist (queries, opts) {
dangerousExtend: opts.dangerousExtend
}

env.checkCanIUse(browserslist.data)
var stats = env.getStat(opts)
if (stats) {
context.customUsage = { }
Expand Down
41 changes: 41 additions & 0 deletions node.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ var FORMAT = 'Browserslist config should be a string or an array ' +

var filenessCache = { }
var configCache = { }
var TIME_TO_UPDATE_CANIUSE = 6 * 30 * 24 * 60 * 60 * 1000

function checkExtend (name) {
var use = ' Use `dangerousExtend` option to disable.'
Expand Down Expand Up @@ -96,6 +97,19 @@ function parsePackage (file) {
return list
}

function getNewestReleaseTime (agentsObj) {
var newestRelease = 0
for (var name in agentsObj) {
var agentReleaseDates = agentsObj[name].releaseDate || {}
newestRelease = Object.keys(agentReleaseDates)
.reduce(function (accTime, elem) {
var agentTime = agentReleaseDates[elem]
return agentTime > accTime ? agentTime : accTime
}, newestRelease)
}
return newestRelease * 1000
}

module.exports = {
loadQueries: function loadQueries (context, name) {
if (!context.dangerousExtend) checkExtend(name)
Expand Down Expand Up @@ -258,5 +272,32 @@ module.exports = {
clearCaches: function clearCaches () {
filenessCache = { }
configCache = { }
},

checkCanIUse: function checkCanIUse (agentsObj) {
var newestBrowserReleaseTime = getNewestReleaseTime(agentsObj)
var halfYearAgo = Date.now() - TIME_TO_UPDATE_CANIUSE

var isWarningNeed = (
newestBrowserReleaseTime !== 0 &&
newestBrowserReleaseTime - halfYearAgo < 0
)

if (isWarningNeed) {
var hasYarnLock = false
eachParent(__filename, function (dir) {
var pckg = path.join(dir, 'package.json')
var yarnLock = path.join(dir, 'yarn.lock')
if (isFile(pckg) && isFile(yarnLock)) {
hasYarnLock = true
}
})

var packageManager = hasYarnLock ? 'yarn upgrade' : 'npm update'
console.warn('[Browserslist] WARN: ' +
'\'caniuse-lite\' is outdated. ' +
'Please run next command \'' + packageManager +
' caniuse-lite browserslist\'')
}
}
}
139 changes: 139 additions & 0 deletions test/release.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
var browserslist = require('../')
var fs = require('fs')

jest.mock('fs')

var originData = browserslist.data
var originWarn = console.warn

function createDate (monthBack) {
var releaseTime = Date.now() - monthBack * 30 * 24 * 60 * 60 * 1000
return releaseTime / 1000
}

var youngerSixMonthsData = {
ie: {
name: 'ie',
released: ['9', '10', '11'],
versions: ['9', '10', '11'],
releaseDate: {
'9': createDate(14),
'10': createDate(8),
'11': createDate(7)
}
},
edge: {
name: 'edge',
released: ['14', '15', '16', '17', '18'],
versions: ['14', '15', '16', '17', '18'],
releaseDate: {
'14': createDate(8),
'15': createDate(6),
'16': createDate(5),
'17': createDate(4),
'18': null
}
},
bb: {
name: 'bb',
released: [],
versions: [],
releaseDate: {}
}
}

var olderSixMonthsData = {
ie: {
name: 'ie',
released: ['9', '10', '11'],
versions: ['9', '10', '11'],
releaseDate: {
'9': createDate(7),
'10': createDate(8),
'11': createDate(10)
}
},
edge: {
name: 'edge',
released: ['14', '15', '16', '17', '18'],
versions: ['14', '15', '16', '17', '18'],
releaseDate: {
'14': createDate(9),
'15': createDate(8),
'16': createDate(12),
'17': createDate(7),
'18': null
}
},
bb: {
name: 'bb',
released: [],
versions: [],
releaseDate: {}
}
}

function findPackage (text) {
return /package.json/.test(text)
}

function findPackageAndYarn (text) {
return /package.json/.test(text) || /yarn.lock/.test(text)
}

function mockStatSync () {
return {
isFile: () => true
}
}

describe('There are versions are younger than 6 months', () => {
beforeEach(() => {
browserslist.data = youngerSixMonthsData
console.warn = jest.fn()
})

afterEach(() => {
browserslist.data = originData
console.warn = originWarn
browserslist.clearCaches()
})

it('checkCanIUse doesn\'t throw warning', () => {
browserslist('last 2 versions')
expect(console.warn).toHaveBeenCalledTimes(0)
})
})

describe('All versions are older than 6 months', () => {
beforeEach(() => {
browserslist.data = olderSixMonthsData
console.warn = jest.fn()
})

afterEach(() => {
browserslist.data = originData
console.warn = originWarn
browserslist.clearCaches()
})

it('yarn detedtion', () => {
fs.existsSync = findPackageAndYarn
fs.statSync = mockStatSync
browserslist('last 2 versions')
expect(console.warn).toHaveBeenCalledWith(
'[Browserslist] WARN: \'caniuse-lite\' is outdated. ' +
'Please run next command \'yarn upgrade caniuse-lite browserslist\''
)
})

it('npm detedtion', () => {
fs.existsSync = findPackage
fs.statSync = mockStatSync
browserslist('last 2 versions')
expect(console.warn).toHaveBeenCalledWith(
'[Browserslist] WARN: \'caniuse-lite\' is outdated. ' +
'Please run next command \'npm update caniuse-lite browserslist\''
)
})
})
14 changes: 14 additions & 0 deletions test/since.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
var browserslist = require('../')

var originData = browserslist.data
var originWarn = console.warn

beforeEach(() => {
browserslist.data = {
Expand All @@ -14,10 +15,23 @@ beforeEach(() => {
}
}
}
console.warn = function () {
if (
typeof arguments[0] === 'string' &&
(
/yarn upgrade/.test(arguments[0]) ||
/npm update/.test(arguments[0])
)
) {
return
}
originWarn.apply(this, arguments)
}
})

afterEach(() => {
browserslist.data = originData
console.warn = originWarn
})

it('selects versions released on year boundaries', () => {
Expand Down
15 changes: 15 additions & 0 deletions test/years.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ var browserslist = require('../')

var RealDate = Date
var originData = browserslist.data
var originWarn = console.warn

function mockDate (iso) {
global.Date = function () {
Object.getPrototypeOf(RealDate.prototype).constructor.call(this)
return new RealDate(iso)
}
global.Date.now = RealDate.now
}

beforeEach(() => {
Expand All @@ -34,11 +36,24 @@ beforeEach(() => {
}
}
}
console.warn = function () {
if (
typeof arguments[0] === 'string' &&
(
/yarn upgrade/.test(arguments[0]) ||
/npm update/.test(arguments[0])
)
) {
return
}
originWarn.apply(this, arguments)
}
})

afterEach(() => {
global.Date = RealDate
browserslist.data = originData
console.warn = originWarn
})

it('selects versions released within last X years', () => {
Expand Down