Files
shields/services/github/github-tag.service.js
François Hodierne 0d8a2d5ca0 Update to eslint 6.8.0 [appveyor githubissuedetail packagist] (#4489)
* update to eslint 6.8.0 and related packages

* Fixes for no-prototype-builtins

* Updates for explicit-function-return-type

* Add ignores for no-explicit-any

* update to eslint 6.8.0 and related packages

* Fixes for no-prototype-builtins

* Updates for explicit-function-return-type

* Add ignores for no-explicit-any

* package: activate eslint-config-standard

* apply updated eslint configuration

* lint: apply eslint feedback after rebase

* Update lockfile

* Update lockfile

* Restore missing deps

* Update lockfile

* Re-add eslint-plugin-node

* Add eslint-plugin-standard and eslint-plugin-react-hooks

* Clean lint

Co-authored-by: Paul Melnikow <github@paulmelnikow.com>
2020-02-29 11:06:36 -06:00

176 lines
4.5 KiB
JavaScript

'use strict'
const gql = require('graphql-tag')
const Joi = require('@hapi/joi')
const { addv } = require('../text-formatters')
const { version: versionColor } = require('../color-formatters')
const { latest } = require('../version')
const { GithubAuthV4Service } = require('./github-auth-service')
const { queryParamSchema } = require('./github-common-release')
const { documentation, transformErrors } = require('./github-helpers')
const { NotFound, redirector } = require('..')
const schema = Joi.object({
data: Joi.object({
repository: Joi.object({
refs: Joi.object({
edges: Joi.array()
.items({
node: Joi.object({
name: Joi.string().required(),
}).required(),
})
.required(),
}).required(),
}).required(),
}).required(),
}).required()
class GithubTag extends GithubAuthV4Service {
static get category() {
return 'version'
}
static get route() {
return {
base: 'github/v/tag',
pattern: ':user/:repo',
queryParamSchema,
}
}
static get examples() {
return [
{
title: 'GitHub tag (latest by date)',
namedParams: { user: 'expressjs', repo: 'express' },
staticPreview: this.render({
version: 'v5.0.0-alpha.7',
sort: 'date',
}),
documentation,
},
{
title: 'GitHub tag (latest SemVer)',
namedParams: { user: 'expressjs', repo: 'express' },
queryParams: { sort: 'semver' },
staticPreview: this.render({ version: 'v4.16.4', sort: 'semver' }),
documentation,
},
{
title: 'GitHub tag (latest SemVer pre-release)',
namedParams: { user: 'expressjs', repo: 'express' },
queryParams: { sort: 'semver', include_prereleases: null },
staticPreview: this.render({
version: 'v5.0.0-alpha.7',
sort: 'semver',
}),
documentation,
},
]
}
static get defaultBadgeData() {
return { label: 'tag' }
}
static render({ version, sort }) {
return {
message: addv(version),
color: sort === 'semver' ? versionColor(version) : 'blue',
}
}
async fetch({ user, repo, sort }) {
const limit = sort === 'semver' ? 100 : 1
return this._requestGraphql({
query: gql`
query($user: String!, $repo: String!, $limit: Int!) {
repository(owner: $user, name: $repo) {
refs(
refPrefix: "refs/tags/"
first: $limit
orderBy: { field: TAG_COMMIT_DATE, direction: DESC }
) {
edges {
node {
name
}
}
}
}
}
`,
variables: { user, repo, limit },
schema,
transformErrors,
})
}
static getLatestTag({ tags, sort, includePrereleases }) {
if (sort === 'semver') {
return latest(tags, { pre: includePrereleases })
}
return tags[0]
}
async handle({ user, repo }, queryParams) {
const sort = queryParams.sort
const includePrereleases = queryParams.include_prereleases !== undefined
const json = await this.fetch({ user, repo, sort })
const tags = json.data.repository.refs.edges.map(edge => edge.node.name)
if (tags.length === 0) {
throw new NotFound({ prettyMessage: 'no tags found' })
}
return this.constructor.render({
version: this.constructor.getLatestTag({
tags,
sort,
includePrereleases,
}),
sort,
})
}
}
const redirects = {
GithubTagRedirect: redirector({
category: 'version',
route: {
base: 'github/tag',
pattern: ':user/:repo',
},
transformPath: ({ user, repo }) => `/github/v/tag/${user}/${repo}`,
transformQueryParams: params => ({ sort: 'semver' }),
dateAdded: new Date('2019-08-17'),
}),
GithubTagPreRedirect: redirector({
category: 'version',
route: {
base: 'github/tag-pre',
pattern: ':user/:repo',
},
transformPath: ({ user, repo }) => `/github/v/tag/${user}/${repo}`,
transformQueryParams: params => ({
sort: 'semver',
include_prereleases: null,
}),
dateAdded: new Date('2019-08-17'),
}),
GithubTagDateRedirect: redirector({
category: 'version',
route: {
base: 'github/tag-date',
pattern: ':user/:repo',
},
transformPath: ({ user, repo }) => `/github/v/tag/${user}/${repo}`,
dateAdded: new Date('2019-08-17'),
}),
}
module.exports = {
GithubTag,
...redirects,
}