1
0
mirror of https://github.com/badges/shields.git synced 2025-04-18 19:44:04 +03:00

Add [JSR] version service (#10030)

* feat: add JSR version badge

* change the label to lowercase

* fix tests
This commit is contained in:
Mo 2024-03-18 21:53:59 +08:00 committed by GitHub
parent 671f4eb2ba
commit 1cf1c0a352
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 75 additions and 0 deletions

View File

@ -0,0 +1,60 @@
import Joi from 'joi'
import { renderVersionBadge } from '../version.js'
import { BaseJsonService, pathParams } from '../index.js'
const schema = Joi.object({
latest: Joi.string().required(),
}).required()
export default class JsrVersion extends BaseJsonService {
static category = 'version'
static route = {
base: 'jsr/v',
pattern: ':scope(@[^/]+)/:packageName',
}
static openApi = {
'/jsr/v/{scope}/{packageName}': {
get: {
summary: 'JSR Version',
description:
'[JSR](https://jsr.io/) is a modern package registry for JavaScript and TypeScript.',
parameters: pathParams(
{
name: 'scope',
example: '@luca',
},
{
name: 'packageName',
example: 'flag',
},
),
},
},
}
static defaultBadgeData = {
label: 'jsr',
}
static render({ version }) {
return renderVersionBadge({ version })
}
async fetch({ scope, packageName }) {
// see https://jsr.io/docs/api#package-version-metadata
return this._requestJson({
schema,
url: `https://jsr.io/${scope}/${packageName}/meta.json`,
httpErrors: {
404: 'package not found',
},
})
}
async handle({ scope, packageName }) {
const { latest } = await this.fetch({ scope, packageName })
return this.constructor.render({ version: latest })
}
}

View File

@ -0,0 +1,15 @@
import { isSemver } from '../test-validators.js'
import { createServiceTester } from '../tester.js'
export const t = await createServiceTester()
t.create('gets the version of @luca/flag')
.get('/@luca/flag.json')
.expectBadge({ label: 'jsr', message: isSemver })
t.create('gets the version of @std/assert')
.get('/@std/assert.json')
.expectBadge({ label: 'jsr', message: isSemver })
t.create('returns an error when getting a non-existent')
.get('/@std/this-is-a-non-existent-package-name.json')
.expectBadge({ label: 'jsr', message: 'package not found' })