This pull request closes #2551: making sure that the keywords don't already appear in the example's title. I also added validation that checks that they are at least two characters long, as this is enforced by the homepage when type your search.
243 lines
7.2 KiB
JavaScript
243 lines
7.2 KiB
JavaScript
'use strict'
|
|
|
|
const LegacyService = require('../legacy-service')
|
|
const {
|
|
makeLabel: getLabel,
|
|
makeBadgeData: getBadgeData,
|
|
} = require('../../lib/badge-data')
|
|
const { makeLogo: getLogo } = require('../../lib/logos')
|
|
const { formatDate } = require('../../lib/text-formatters')
|
|
const { age: ageColor } = require('../../lib/color-formatters')
|
|
const {
|
|
documentation,
|
|
stateColor: githubStateColor,
|
|
commentsColor: githubCommentsColor,
|
|
checkErrorResponse: githubCheckErrorResponse,
|
|
} = require('./github-helpers')
|
|
|
|
const commonExampleAttrs = {
|
|
keywords: ['pullrequest', 'detail'],
|
|
documentation,
|
|
}
|
|
|
|
// This legacy service should be rewritten to use e.g. BaseJsonService.
|
|
//
|
|
// Tips for rewriting:
|
|
// https://github.com/badges/shields/blob/master/doc/rewriting-services.md
|
|
//
|
|
// Do not base new services on this code.
|
|
module.exports = class GithubIssueDetail extends LegacyService {
|
|
static get category() {
|
|
return 'issue-tracking'
|
|
}
|
|
|
|
static get route() {
|
|
return {
|
|
base: 'github/issues/detail',
|
|
pattern:
|
|
':which(s|title|u|label|comments|age|last-update)/:user/:repo/:number(0-9+)',
|
|
}
|
|
}
|
|
|
|
static get examples() {
|
|
return [
|
|
{
|
|
title: 'GitHub issue/pull request state',
|
|
pattern: 's/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '979',
|
|
},
|
|
staticPreview: {
|
|
label: 'issue 979',
|
|
message: 'closed',
|
|
color: 'red',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
{
|
|
title: 'GitHub issue/pull request title',
|
|
pattern: 'title/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '1290',
|
|
},
|
|
staticPreview: {
|
|
label: 'issue 1290',
|
|
message: 'Node 9 support',
|
|
color: 'lightgrey',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
{
|
|
title: 'GitHub issue/pull request author',
|
|
pattern: 'u/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '979',
|
|
},
|
|
staticPreview: {
|
|
label: 'author',
|
|
message: 'paulmelnikow',
|
|
color: 'lightgrey',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
{
|
|
title: 'GitHub issue/pull request label',
|
|
pattern: 'label/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '979',
|
|
},
|
|
staticPreview: {
|
|
label: 'label',
|
|
message: 'bug | developer-experience',
|
|
color: 'lightgrey',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
{
|
|
title: 'GitHub issue/pull request comments',
|
|
pattern: 'comments/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '979',
|
|
},
|
|
staticPreview: {
|
|
label: 'comments',
|
|
message: '24',
|
|
color: 'yellow',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
{
|
|
title: 'GitHub issue/pull request age',
|
|
pattern: 'age/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '979',
|
|
},
|
|
staticPreview: {
|
|
label: 'created',
|
|
message: 'april 2017',
|
|
color: 'orange',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
{
|
|
title: 'GitHub issue/pull request last update',
|
|
pattern: 'last-update/:user/:repo/:number',
|
|
namedParams: {
|
|
user: 'badges',
|
|
repo: 'shields',
|
|
number: '979',
|
|
},
|
|
staticPreview: {
|
|
label: 'updated',
|
|
message: 'december 2017',
|
|
color: 'orange',
|
|
},
|
|
...commonExampleAttrs,
|
|
},
|
|
]
|
|
}
|
|
|
|
static registerLegacyRouteHandler({ camp, cache, githubApiProvider }) {
|
|
camp.route(
|
|
/^\/github\/(?:issues|pulls)\/detail\/(s|title|u|label|comments|age|last-update)\/([^/]+)\/([^/]+)\/(\d+)\.(svg|png|gif|jpg|json)$/,
|
|
cache((queryParams, match, sendBadge, request) => {
|
|
const [, which, owner, repo, number, format] = match
|
|
const uri = `/repos/${owner}/${repo}/issues/${number}`
|
|
const badgeData = getBadgeData(
|
|
`issue/pull request ${number}`,
|
|
queryParams
|
|
)
|
|
if (badgeData.template === 'social') {
|
|
badgeData.logo = getLogo('github', queryParams)
|
|
}
|
|
githubApiProvider.request(request, uri, {}, (err, res, buffer) => {
|
|
if (
|
|
githubCheckErrorResponse(
|
|
badgeData,
|
|
err,
|
|
res,
|
|
'issue, pull request or repo not found'
|
|
)
|
|
) {
|
|
sendBadge(format, badgeData)
|
|
return
|
|
}
|
|
try {
|
|
const parsedData = JSON.parse(buffer)
|
|
const isPR = 'pull_request' in parsedData
|
|
const noun = isPR ? 'pull request' : 'issue'
|
|
badgeData.text[0] = getLabel(
|
|
`${noun} ${parsedData.number}`,
|
|
queryParams
|
|
)
|
|
switch (which) {
|
|
case 's': {
|
|
const state = (badgeData.text[1] = parsedData.state)
|
|
badgeData.colorscheme = undefined
|
|
badgeData.colorB = queryParams.colorB || githubStateColor(state)
|
|
break
|
|
}
|
|
case 'title':
|
|
badgeData.text[1] = parsedData.title
|
|
break
|
|
case 'u':
|
|
badgeData.text[0] = getLabel('author', queryParams)
|
|
badgeData.text[1] = parsedData.user.login
|
|
break
|
|
case 'label':
|
|
badgeData.text[0] = getLabel('label', queryParams)
|
|
badgeData.text[1] = parsedData.labels
|
|
.map(i => i.name)
|
|
.join(' | ')
|
|
if (parsedData.labels.length === 1) {
|
|
badgeData.colorscheme = undefined
|
|
badgeData.colorB =
|
|
queryParams.colorB || parsedData.labels[0].color
|
|
}
|
|
break
|
|
case 'comments': {
|
|
badgeData.text[0] = getLabel('comments', queryParams)
|
|
const comments = (badgeData.text[1] = parsedData.comments)
|
|
badgeData.colorscheme = undefined
|
|
badgeData.colorB =
|
|
queryParams.coloB || githubCommentsColor(comments)
|
|
break
|
|
}
|
|
case 'age':
|
|
case 'last-update': {
|
|
const label = which === 'age' ? 'created' : 'updated'
|
|
const date =
|
|
which === 'age'
|
|
? parsedData.created_at
|
|
: parsedData.updated_at
|
|
badgeData.text[0] = getLabel(label, queryParams)
|
|
badgeData.text[1] = formatDate(date)
|
|
badgeData.colorscheme = ageColor(Date.parse(date))
|
|
break
|
|
}
|
|
default:
|
|
throw Error('Unreachable due to regex')
|
|
}
|
|
sendBadge(format, badgeData)
|
|
} catch (e) {
|
|
badgeData.text[1] = 'invalid'
|
|
sendBadge(format, badgeData)
|
|
}
|
|
})
|
|
})
|
|
)
|
|
}
|
|
}
|