move [githubtag] and [githubrelease] under /v, move variants to query params (#3610)
* move GH tag and release under /v, move variants to query params
- move github /tag and /release under /v
- both sort by date as default
- specify sort=date/semver, include_prereleases as query params
- use graphql api for tags
* pass string params from example defs to modal
This commit is contained in:
@@ -1,80 +1,76 @@
|
||||
'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 { GithubAuthV3Service } = require('./github-auth-service')
|
||||
const { documentation, errorMessagesFor } = require('./github-helpers')
|
||||
const { NotFound } = require('..')
|
||||
const { GithubAuthV4Service } = require('./github-auth-service')
|
||||
const { documentation, transformErrors } = require('./github-helpers')
|
||||
const { NotFound, redirector } = require('..')
|
||||
|
||||
const schema = Joi.alternatives()
|
||||
.try(
|
||||
Joi.array()
|
||||
.items(
|
||||
Joi.object({
|
||||
name: Joi.string().required(),
|
||||
})
|
||||
)
|
||||
.required(),
|
||||
Joi.array().length(0)
|
||||
)
|
||||
.required()
|
||||
const queryParamSchema = Joi.object({
|
||||
include_prereleases: Joi.equal(''),
|
||||
sort: Joi.string()
|
||||
.valid('date', 'semver')
|
||||
.default('date'),
|
||||
}).required()
|
||||
|
||||
module.exports = class GithubTag extends GithubAuthV3Service {
|
||||
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',
|
||||
pattern: ':variant(tag|tag-pre|tag-date)/:user/:repo',
|
||||
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)',
|
||||
pattern: 'tag/:user/:repo',
|
||||
namedParams: {
|
||||
user: 'expressjs',
|
||||
repo: 'express',
|
||||
},
|
||||
staticPreview: {
|
||||
label: 'tag',
|
||||
message: 'v4.16.4',
|
||||
color: 'blue',
|
||||
},
|
||||
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)',
|
||||
pattern: 'tag-pre/:user/:repo',
|
||||
namedParams: {
|
||||
user: 'expressjs',
|
||||
repo: 'express',
|
||||
},
|
||||
staticPreview: {
|
||||
label: 'tag',
|
||||
message: 'v5.0.0-alpha.7',
|
||||
color: 'orange',
|
||||
},
|
||||
documentation,
|
||||
},
|
||||
{
|
||||
title: 'GitHub tag (latest by date)',
|
||||
pattern: 'tag-date/:user/:repo',
|
||||
namedParams: {
|
||||
user: 'expressjs',
|
||||
repo: 'express',
|
||||
},
|
||||
staticPreview: {
|
||||
label: 'tag',
|
||||
message: 'v5.0.0-alpha.7',
|
||||
color: 'blue',
|
||||
},
|
||||
namedParams: { user: 'expressjs', repo: 'express' },
|
||||
queryParams: { sort: 'semver', include_prereleases: null },
|
||||
staticPreview: this.render({
|
||||
version: 'v5.0.0-alpha.7',
|
||||
sort: 'semver',
|
||||
}),
|
||||
documentation,
|
||||
},
|
||||
]
|
||||
@@ -84,39 +80,101 @@ module.exports = class GithubTag extends GithubAuthV3Service {
|
||||
return { label: 'tag' }
|
||||
}
|
||||
|
||||
static render({ usingSemver, version }) {
|
||||
static render({ version, sort }) {
|
||||
return {
|
||||
message: addv(version),
|
||||
color: usingSemver ? versionColor(version) : 'blue',
|
||||
color: sort === 'semver' ? versionColor(version) : 'blue',
|
||||
}
|
||||
}
|
||||
|
||||
static transform({ usingSemver, includePre, json }) {
|
||||
const versions = json.map(({ name }) => name)
|
||||
if (usingSemver) {
|
||||
return latest(versions, { pre: includePre })
|
||||
} else {
|
||||
return versions[0]
|
||||
}
|
||||
}
|
||||
|
||||
async handle({ variant, user, repo }) {
|
||||
const usingSemver = variant !== 'tag-date'
|
||||
const includePre = variant === 'tag-pre'
|
||||
|
||||
const json = await this._requestJson({
|
||||
url: `/repos/${user}/${repo}/tags`,
|
||||
async fetch({ user, repo, sort }) {
|
||||
const limit = sort === 'semver' ? 100 : 1
|
||||
return await 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,
|
||||
errorMessages: errorMessagesFor(),
|
||||
transformErrors,
|
||||
})
|
||||
if (json.length === 0) {
|
||||
throw new NotFound({ prettyMessage: 'none' })
|
||||
}
|
||||
|
||||
static getLatestTag({ tags, sort, includePrereleases }) {
|
||||
if (sort === 'semver') {
|
||||
return latest(tags, { pre: includePrereleases })
|
||||
}
|
||||
const version = this.constructor.transform({
|
||||
usingSemver,
|
||||
includePre,
|
||||
json,
|
||||
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,
|
||||
})
|
||||
return this.constructor.render({ usingSemver, version })
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user