Files
shields/services/visual-studio-marketplace/visual-studio-marketplace-version.service.js
chris48s 095e4f889a migrate some services from examples to openApi part 45; affects [github coveralls visualstudiomarketplace] (#9930)
* migrate some services from examples to openApi

* update e2e test to use simpler example
2024-02-11 13:04:42 +00:00

74 lines
2.0 KiB
JavaScript

import Joi from 'joi'
import { pathParam, queryParam } from '../index.js'
import { renderVersionBadge } from '../version.js'
import VisualStudioMarketplaceBase from './visual-studio-marketplace-base.js'
const queryParamSchema = Joi.object({
include_prereleases: Joi.equal(''),
}).required()
export default class VisualStudioMarketplaceVersion extends VisualStudioMarketplaceBase {
static category = 'version'
static route = {
base: '',
pattern: '(visual-studio-marketplace|vscode-marketplace)/v/:extensionId',
queryParamSchema,
}
static openApi = {
'/visual-studio-marketplace/v/{extensionId}': {
get: {
summary: 'Visual Studio Marketplace Version',
parameters: [
pathParam({ name: 'extensionId', example: 'swellaby.rust-pack' }),
queryParam({
name: 'include_prereleases',
schema: { type: 'boolean' },
example: null,
}),
],
},
},
}
static defaultBadgeData = {
label: 'version',
}
static render({ version }) {
return renderVersionBadge({ version })
}
transform({ json }, includePrereleases) {
const { extension } = this.transformExtension({ json })
const preReleaseKey = 'Microsoft.VisualStudio.Code.PreRelease'
let version
if (!includePrereleases) {
version = extension.versions.find(
obj =>
!obj.properties.find(
({ key, value }) => key === preReleaseKey && value === 'true',
),
)?.version
}
// this condition acts as the 'else' clause AND as a fallback,
// in case all versions are pre-release
if (!version) {
version = extension.versions[0].version
}
return { version }
}
async handle({ extensionId }, queryParams) {
const json = await this.fetch({ extensionId })
const includePrereleases = queryParams.include_prereleases !== undefined
const { version } = this.transform({ json }, includePrereleases)
return this.constructor.render({ version })
}
}