This is consistent with what we're pretty much already doing, and saves us from making the request during code review. These were all autofixed and most of them seem easier to read. Some in the legacy services should be rewritten in more legible forms during refactor (ie using intermediate variables, or using request’s qs option). There are some in helper functions and elsewhere that should get rewritten separately. I don't want to change them in this PR because the changes will get lost in this diff, though we could identify them here and fix them before or just after.
118 lines
2.7 KiB
JavaScript
118 lines
2.7 KiB
JavaScript
/**
|
|
* Commonly-used functions for determining the colour to use for a badge,
|
|
* including colours based off download count, version number, etc.
|
|
*/
|
|
'use strict'
|
|
|
|
const moment = require('moment')
|
|
|
|
function version(version) {
|
|
if (typeof version !== 'string' && typeof version !== 'number') {
|
|
throw new Error(`Can't generate a version color for ${version}`)
|
|
}
|
|
version = `${version}`
|
|
let first = version[0]
|
|
if (first === 'v') {
|
|
first = version[1]
|
|
}
|
|
if (first === '0' || /alpha|beta|snapshot|dev|pre/i.test(version)) {
|
|
return 'orange'
|
|
} else {
|
|
return 'blue'
|
|
}
|
|
}
|
|
|
|
function downloadCount(downloads) {
|
|
return floorCount(downloads, 10, 100, 1000)
|
|
}
|
|
|
|
function coveragePercentage(percentage) {
|
|
return floorCount(percentage, 80, 90, 100)
|
|
}
|
|
|
|
function floorCount(value, yellow, yellowgreen, green) {
|
|
if (value <= 0) {
|
|
return 'red'
|
|
} else if (value < yellow) {
|
|
return 'yellow'
|
|
} else if (value < yellowgreen) {
|
|
return 'yellowgreen'
|
|
} else if (value < green) {
|
|
return 'green'
|
|
} else {
|
|
return 'brightgreen'
|
|
}
|
|
}
|
|
|
|
function letterScore(score) {
|
|
if (score === 'A') {
|
|
return 'brightgreen'
|
|
} else if (score === 'B') {
|
|
return 'green'
|
|
} else if (score === 'C') {
|
|
return 'yellowgreen'
|
|
} else if (score === 'D') {
|
|
return 'yellow'
|
|
} else if (score === 'E') {
|
|
return 'orange'
|
|
} else {
|
|
return 'red'
|
|
}
|
|
}
|
|
|
|
function colorScale(steps, colors, reversed) {
|
|
if (steps === undefined) {
|
|
throw Error('When invoking colorScale, steps should be provided.')
|
|
}
|
|
|
|
const defaultColors = {
|
|
1: ['red', 'brightgreen'],
|
|
2: ['red', 'yellow', 'brightgreen'],
|
|
3: ['red', 'yellow', 'green', 'brightgreen'],
|
|
4: ['red', 'yellow', 'yellowgreen', 'green', 'brightgreen'],
|
|
5: ['red', 'orange', 'yellow', 'yellowgreen', 'green', 'brightgreen'],
|
|
}
|
|
|
|
if (typeof colors === 'undefined') {
|
|
if (steps.length in defaultColors) {
|
|
colors = defaultColors[steps.length]
|
|
} else {
|
|
throw Error(`No default colors for ${steps.length} steps.`)
|
|
}
|
|
}
|
|
|
|
if (steps.length !== colors.length - 1) {
|
|
throw Error(
|
|
'When colors are provided, there should be n + 1 colors for n steps.'
|
|
)
|
|
}
|
|
|
|
if (reversed) {
|
|
colors = Array.from(colors).reverse()
|
|
}
|
|
|
|
return value => {
|
|
const stepIndex = steps.findIndex(step => value < step)
|
|
|
|
// For the final step, stepIndex is -1, so in all cases this expression
|
|
// works swimmingly.
|
|
return colors.slice(stepIndex)[0]
|
|
}
|
|
}
|
|
|
|
function age(date) {
|
|
const colorByAge = colorScale([7, 30, 180, 365, 730], undefined, true)
|
|
const daysElapsed = moment().diff(moment(date), 'days')
|
|
return colorByAge(daysElapsed)
|
|
}
|
|
|
|
module.exports = {
|
|
version,
|
|
downloadCount,
|
|
coveragePercentage,
|
|
floorCount,
|
|
letterScore,
|
|
colorScale,
|
|
age,
|
|
}
|