Files
shields/services/npm/npm-version.service.js
2019-09-07 20:03:41 +00:00

108 lines
2.7 KiB
JavaScript

'use strict'
const Joi = require('@hapi/joi')
const { renderVersionBadge } = require('../version')
const NpmBase = require('./npm-base')
const { NotFound } = require('..')
const keywords = ['node']
// Joi.string should be a semver.
const schema = Joi.object()
.keys({ latest: Joi.string().required() })
.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 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 get defaultBadgeData() {
return { label: 'npm' }
}
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'],
})
}
}