Files
shields/services/docker/docker-helpers.js
Amir Zarrinkafsh 0e3b521ac7 Add [Docker] image size and version badges (#4562)
* Add [Docker] image size badge

* Add [Docker] version/tag badge

* [Docker] allow version badge to retrieve results from multiple pages

* [Docker] allow size badge to retrieve results from multiple pages

* [Docker] clean up size and version badges before squash

* [Docker] Size badge change API call to explicit tag

* [Docker] Conditionally include tag route param for badges

* [Docker] Implement feedback for size and version badges

* [Docker] Implement feedback round 2 for size and version badges

* [Docker] Optimise API lookups and remove date sorting on tag badge

* [Docker] Implement feedback round 3 for version badge

* [Docker] Implement feedback round 4 for version badge

* [Docker] Adjust unit and service tests for version badge

* [Docker] Move unit test data into fixtures

* [Docker] Fix Docker version badge route prefix

* [Docker] Add date and semver lookup for size badge

* [Docker] Implement feedback round 5 for version badge

* [Docker] Implement feedback round 6

* [Docker] Tweak error messaging for consistent wording

* [Docker] Adjust badge titles

* [Docker] Guard and treat images with missing digest

* [Docker] Guard and treat images with missing digest
2020-02-13 15:17:55 -06:00

65 lines
1.5 KiB
JavaScript

'use strict'
const dockerBlue = '066da5' // see https://github.com/badges/shields/pull/1690
const { NotFound } = require('..')
function buildDockerUrl(badgeName, includeTagRoute) {
if (includeTagRoute) {
return {
base: `docker/${badgeName}`,
pattern: ':user/:repo/:tag*',
}
} else {
return {
base: `docker/${badgeName}`,
pattern: ':user/:repo',
}
}
}
function getDockerHubUser(user) {
return user === '_' ? 'library' : user
}
async function getMultiPageData({ user, repo, fetch }) {
const data = await fetch({ user, repo })
if (data.count === 0) {
throw new NotFound({ prettyMessage: 'repository not found' })
}
const numberOfPages = Math.ceil(data.count / 100) // Maximum of 100 results can be returned per page
if (numberOfPages === 1) {
return data.results
}
const pageData = await Promise.all(
[...Array(numberOfPages - 1).keys()].map((_, i) =>
fetch({ user, repo, page: ++i + 1 })
)
)
return [...data.results].concat(...pageData.map(p => p.results))
}
function getDigestSemVerMatches({ data, digest }) {
const matches = data
.filter(d => d.images.some(i => i.digest === digest))
.map(d => d.name)
let version = matches[0]
matches.forEach(name => {
const dots = (name.match(/\./g) || []).length
const olddots = (version.match(/\./g) || []).length
version = dots >= olddots && name !== 'latest' ? name : version
})
return version
}
module.exports = {
dockerBlue,
buildDockerUrl,
getDockerHubUser,
getMultiPageData,
getDigestSemVerMatches,
}