108 lines
2.7 KiB
JavaScript
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'],
|
|
})
|
|
}
|
|
}
|