Files
shields/services/travis/travis-php-version.service.js

111 lines
2.8 KiB
JavaScript

'use strict'
const Joi = require('@hapi/joi')
const {
minorVersion,
versionReduction,
getPhpReleases,
} = require('../php-version')
const { BaseJsonService } = require('..')
const optionalNumberOrString = Joi.alternatives(Joi.string(), Joi.number())
const schema = Joi.object({
branch: Joi.object({
config: Joi.object({
php: Joi.array().items(optionalNumberOrString),
matrix: Joi.object({
include: Joi.array().items(Joi.object({ php: optionalNumberOrString })),
}),
jobs: Joi.object({
include: Joi.array().items(Joi.object({ php: optionalNumberOrString })),
}),
}).required(),
}).required(),
}).required()
module.exports = class TravisPhpVersion extends BaseJsonService {
static get category() {
return 'platform-support'
}
static get route() {
return {
base: 'travis/php-v',
pattern: ':user/:repo/:branch+',
}
}
static get examples() {
return [
{
title: 'PHP version from Travis config',
namedParams: { user: 'symfony', repo: 'symfony', branch: 'master' },
staticPreview: this.render({ reduction: ['^7.1.3'] }),
},
]
}
static get defaultBadgeData() {
return {
label: 'php',
}
}
static render({ reduction, hasHhvm }) {
return {
message: reduction.concat(hasHhvm ? ['HHVM'] : []).join(', '),
color: 'blue',
}
}
constructor(context, config) {
super(context, config)
this._githubApiProvider = context.githubApiProvider
}
async transform({ branch: { config } }) {
let travisVersions = []
// from php
if (config.php) {
travisVersions = travisVersions.concat(config.php.map(v => v.toString()))
}
// from matrix
if (config.matrix && config.matrix.include) {
travisVersions = travisVersions.concat(
config.matrix.include.filter(v => 'php' in v).map(v => v.php.toString())
)
}
// from jobs
if (config.jobs && config.jobs.include) {
travisVersions = travisVersions.concat(
config.jobs.include.filter(v => 'php' in v).map(v => v.php.toString())
)
}
const versions = travisVersions
.map(v => minorVersion(v))
.filter(v => v.includes('.'))
return {
reduction: versionReduction(
versions,
await getPhpReleases(this._githubApiProvider)
),
hasHhvm: travisVersions.find(v => v.startsWith('hhvm')),
}
}
async handle({ user, repo, branch }) {
const travisConfig = await this._requestJson({
schema,
url: `https://api.travis-ci.org/repos/${user}/${repo}/branches/${branch}`,
errorMessages: {
404: 'repo not found',
},
})
const { reduction, hasHhvm } = await this.transform(travisConfig)
return this.constructor.render({ reduction, hasHhvm })
}
}