Files
shields/services/npm/npm-version.service.js
Paul Melnikow fafb22efee Move "good" badge helpers from lib/ to services/ (#3101)
This moves a few helpers from `lib/` to `services/`:

build-status.js
build-status.spec.js
color-formatters.js
color-formatters.spec.js
contributor-count.js
licenses.js
licenses.spec.js
php-version.js
php-version.spec.js
text-formatters.js
text-formatters.spec.js
version.js
version.spec.js

And one from `lib/` to `core/`:

unhandled-rejection.spec.js

The diff is long, but the changes are straightforward.

Ref #2832
2019-02-27 20:47:46 -05:00

107 lines
2.7 KiB
JavaScript

'use strict'
const Joi = require('joi')
const { renderVersionBadge } = require('../version')
const { NotFound } = require('..')
const NpmBase = require('./npm-base')
const keywords = ['node']
// Joi.string should be a semver.
const schema = Joi.object()
.pattern(/./, Joi.string())
.required()
module.exports = class NpmVersion extends NpmBase {
static get category() {
return 'version'
}
static get route() {
return this.buildRoute('npm/v', { withTag: true })
}
static get defaultBadgeData() {
return { label: 'npm' }
}
static get examples() {
return [
{
title: 'npm',
pattern: ':packageName',
namedParams: { packageName: 'npm' },
staticPreview: this.render({ version: '6.3.0' }),
keywords,
},
{
title: 'npm (scoped)',
pattern: ':scope/:packageName',
namedParams: { scope: '@cycle', packageName: 'core' },
staticPreview: this.render({ version: '7.0.0' }),
keywords,
},
{
title: 'npm (tag)',
pattern: ':packageName/:tag',
namedParams: { packageName: 'npm', tag: 'next' },
staticPreview: this.render({ tag: 'latest', version: '6.3.0' }),
keywords,
},
{
title: 'npm (custom registry)',
pattern: ':packageName/:tag',
namedParams: { packageName: 'npm', tag: 'next' },
queryParams: { registry_uri: 'https://registry.npmjs.com' },
staticPreview: this.render({ tag: 'latest', version: '7.0.0' }),
keywords,
},
{
title: 'npm (scoped with tag)',
pattern: ':scope/:packageName/:tag',
namedParams: { scope: '@cycle', packageName: 'core', tag: 'canary' },
staticPreview: this.render({ tag: 'latest', version: '6.3.0' }),
keywords,
},
]
}
static render({ tag, version }) {
const { label: defaultLabel } = this.defaultBadgeData
return renderVersionBadge({
tag,
version,
defaultLabel,
})
}
async handle(namedParams, queryParams) {
const {
scope,
packageName,
tag,
registryUrl,
} = this.constructor.unpackParams(namedParams, queryParams)
const slug =
scope === undefined
? packageName
: this.constructor.encodeScopedPackage({ scope, packageName })
const packageData = await this._requestJson({
schema,
url: `${registryUrl}/-/package/${slug}/dist-tags`,
errorMessages: { 404: 'package not found' },
})
if (tag && !(tag in packageData)) {
throw new NotFound({ prettyMessage: 'tag not found' })
}
return this.constructor.render({
tag,
version: packageData[tag || 'latest'],
})
}
}