Files
shields/services/packagist/packagist-license.service.js

90 lines
2.0 KiB
JavaScript

import Joi from 'joi'
import { renderLicenseBadge } from '../licenses.js'
import { optionalUrl } from '../validators.js'
import { NotFound, pathParam, queryParam } from '../index.js'
import {
BasePackagistService,
customServerDocumentationFragment,
description,
} from './packagist-base.js'
const packageSchema = Joi.array()
.items(
Joi.object({
version: Joi.string(),
license: Joi.array(),
}).required(),
)
.required()
const schema = Joi.object({
packages: Joi.object().pattern(/^/, packageSchema).required(),
}).required()
const queryParamSchema = Joi.object({
server: optionalUrl,
}).required()
export default class PackagistLicense extends BasePackagistService {
static category = 'license'
static route = {
base: 'packagist/l',
pattern: ':user/:repo',
queryParamSchema,
}
static openApi = {
'/packagist/l/{user}/{repo}': {
get: {
summary: 'Packagist License',
description,
parameters: [
pathParam({
name: 'user',
example: 'guzzlehttp',
}),
pathParam({
name: 'repo',
example: 'guzzle',
}),
queryParam({
name: 'server',
description: customServerDocumentationFragment,
example: 'https://packagist.org',
}),
],
},
},
}
static defaultBadgeData = {
label: 'license',
}
transform({ json, user, repo }) {
const packageName = this.getPackageName(user, repo)
const versions = BasePackagistService.expandPackageVersions(
json,
packageName,
)
const version = this.findLatestRelease(versions)
const license = version.license
if (!license) {
throw new NotFound({ prettyMessage: 'license not found' })
}
return { license }
}
async handle({ user, repo }, { server }) {
const json = await this.fetch({ user, repo, schema, server })
const { license } = this.transform({ json, user, repo })
return renderLicenseBadge({ license })
}
}