Skip to content

Commit 1cf1c0a

Browse files
authored
Add [JSR] version service (#10030)
* feat: add JSR version badge * change the label to lowercase * fix tests
1 parent 671f4eb commit 1cf1c0a

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

services/jsr/jsr-version.service.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import Joi from 'joi'
2+
import { renderVersionBadge } from '../version.js'
3+
import { BaseJsonService, pathParams } from '../index.js'
4+
5+
const schema = Joi.object({
6+
latest: Joi.string().required(),
7+
}).required()
8+
9+
export default class JsrVersion extends BaseJsonService {
10+
static category = 'version'
11+
12+
static route = {
13+
base: 'jsr/v',
14+
pattern: ':scope(@[^/]+)/:packageName',
15+
}
16+
17+
static openApi = {
18+
'/jsr/v/{scope}/{packageName}': {
19+
get: {
20+
summary: 'JSR Version',
21+
description:
22+
'[JSR](https://jsr.io/) is a modern package registry for JavaScript and TypeScript.',
23+
parameters: pathParams(
24+
{
25+
name: 'scope',
26+
example: '@luca',
27+
},
28+
{
29+
name: 'packageName',
30+
example: 'flag',
31+
},
32+
),
33+
},
34+
},
35+
}
36+
37+
static defaultBadgeData = {
38+
label: 'jsr',
39+
}
40+
41+
static render({ version }) {
42+
return renderVersionBadge({ version })
43+
}
44+
45+
async fetch({ scope, packageName }) {
46+
// see https://jsr.io/docs/api#package-version-metadata
47+
return this._requestJson({
48+
schema,
49+
url: `https://jsr.io/${scope}/${packageName}/meta.json`,
50+
httpErrors: {
51+
404: 'package not found',
52+
},
53+
})
54+
}
55+
56+
async handle({ scope, packageName }) {
57+
const { latest } = await this.fetch({ scope, packageName })
58+
return this.constructor.render({ version: latest })
59+
}
60+
}

services/jsr/jsr-version.tester.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { isSemver } from '../test-validators.js'
2+
import { createServiceTester } from '../tester.js'
3+
export const t = await createServiceTester()
4+
5+
t.create('gets the version of @luca/flag')
6+
.get('/@luca/flag.json')
7+
.expectBadge({ label: 'jsr', message: isSemver })
8+
9+
t.create('gets the version of @std/assert')
10+
.get('/@std/assert.json')
11+
.expectBadge({ label: 'jsr', message: isSemver })
12+
13+
t.create('returns an error when getting a non-existent')
14+
.get('/@std/this-is-a-non-existent-package-name.json')
15+
.expectBadge({ label: 'jsr', message: 'package not found' })

0 commit comments

Comments
 (0)