'use strict' const NPMBase = require('../npm/npm-base') const keywords = ['npm'] module.exports = class NodeVersionBase extends NPMBase { static get category() { return 'platform-support' } static get route() { return this.buildRoute(`node/${this.path}`, { withTag: true }) } static get examples() { const type = this.type const documentation = `

${this.documentation} The node version support is retrieved from the engines.node section in package.json.

` const prefix = `node-${type}` return [ { title: `${prefix}`, pattern: ':packageName', namedParams: { packageName: 'passport' }, staticPreview: this.renderStaticPreview({ nodeVersionRange: '>= 6.0.0', }), keywords, documentation, }, { title: `${prefix} (scoped)`, pattern: '@:scope/:packageName', namedParams: { scope: 'stdlib', packageName: 'stdlib' }, staticPreview: this.renderStaticPreview({ nodeVersionRange: '>= 6.0.0', }), keywords, documentation, }, { title: `${prefix} (tag)`, pattern: ':packageName/:tag', namedParams: { packageName: 'passport', tag: 'latest' }, staticPreview: this.renderStaticPreview({ nodeVersionRange: '>= 6.0.0', tag: 'latest', }), keywords, documentation, }, { title: `${prefix} (scoped with tag)`, pattern: '@:scope/:packageName/:tag', namedParams: { scope: 'stdlib', packageName: 'stdlib', tag: 'latest' }, staticPreview: this.renderStaticPreview({ nodeVersionRange: '>= 6.0.0', tag: 'latest', }), keywords, documentation, }, { title: `${prefix} (scoped with tag, custom registry)`, pattern: '@:scope/:packageName/:tag', namedParams: { scope: 'stdlib', packageName: 'stdlib', tag: 'latest' }, queryParams: { registry_uri: 'https://registry.npmjs.com' }, staticPreview: this.renderStaticPreview({ nodeVersionRange: '>= 6.0.0', tag: 'latest', }), keywords, documentation, }, ] } static renderStaticPreview({ tag, nodeVersionRange }) { // Since this badge has an async `render()` function, but `get examples()` has to // be synchronous, this method exists. It should return the same value as the // real `render()`. There's a unit test to check that. return { label: tag ? `${this.defaultBadgeData.label}@${tag}` : undefined, message: nodeVersionRange, color: 'brightgreen', } } static async render({ tag, nodeVersionRange }) { // Atypically, the `render()` function of this badge is `async` because it needs to pull // data from the server. const label = tag ? `${this.defaultBadgeData.label}@${tag}` : undefined if (nodeVersionRange === undefined) { return { label, message: 'not specified', color: 'lightgray', } } else { return { label, message: nodeVersionRange, color: await this.colorResolver(nodeVersionRange), } } } async handle(namedParams, queryParams) { const { scope, packageName, tag, registryUrl, } = this.constructor.unpackParams(namedParams, queryParams) const { engines } = await this.fetchPackageData({ scope, packageName, registryUrl, tag, }) const { node: nodeVersionRange } = engines || {} return this.constructor.render({ tag, nodeVersionRange }) } }