Skip to content

Commit 7e215ef

Browse files
authored
mirage: Add meta field in GET /api/v1/crates/:id/versions (#10294)
1 parent 7a140d1 commit 7e215ef

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

mirage/route-handlers/-utils.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { Response } from 'miragejs';
2+
import semverParse from 'semver/functions/parse';
3+
import semverSort from 'semver/functions/rsort';
24

35
export function notFound() {
46
return new Response(
@@ -31,3 +33,17 @@ export function compareIsoDates(a, b) {
3133
let bDate = new Date(b);
3234
return aDate < bDate ? -1 : aDate > bDate ? 1 : 0;
3335
}
36+
37+
export function releaseTracks(versions) {
38+
let versionNums = versions.models.filter(it => !it.yanked).map(it => it.num);
39+
semverSort(versionNums, { loose: true });
40+
let tracks = {};
41+
for (let num of versionNums) {
42+
let semver = semverParse(num, { loose: true });
43+
if (!semver || semver.prerelease.length !== 0) continue;
44+
let name = semver.major == 0 ? `0.${semver.minor}` : `${semver.major}`;
45+
if (name in tracks) continue;
46+
tracks[name] = { highest: num };
47+
}
48+
return tracks;
49+
}

mirage/route-handlers/crates.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Response } from 'miragejs';
22

33
import { getSession } from '../utils/session';
4-
import { compareIsoDates, compareStrings, notFound, pageParams } from './-utils';
4+
import { compareIsoDates, compareStrings, notFound, pageParams, releaseTracks } from './-utils';
55

66
export function list(schema, request) {
77
const { start, end } = pageParams(request);
@@ -140,12 +140,23 @@ export function register(server) {
140140
return { ok: true };
141141
});
142142

143-
server.get('/api/v1/crates/:name/versions', (schema, request) => {
143+
server.get('/api/v1/crates/:name/versions', function (schema, request) {
144144
let { name } = request.params;
145145
let crate = schema.crates.findBy({ name });
146146
if (!crate) return notFound();
147147

148-
return crate.versions.sort((a, b) => compareIsoDates(b.created_at, a.created_at));
148+
let versions = crate.versions.sort((a, b) => compareIsoDates(b.created_at, a.created_at));
149+
let total = versions.length;
150+
let include = request.queryParams?.include ?? '';
151+
let release_tracks = include.split(',').includes('release_tracks') && releaseTracks(crate.versions);
152+
let resp = {
153+
...this.serialize(versions),
154+
meta: { total, next_page: null },
155+
};
156+
if (release_tracks && Object.keys(release_tracks).length !== 0) {
157+
resp.meta.release_tracks = release_tracks;
158+
}
159+
return resp;
149160
});
150161

151162
server.get('/api/v1/crates/:name/:version_num/authors', (schema, request) => {

tests/mirage/crates/versions/list-test.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module('Mirage | GET /api/v1/crates/:id/versions', function (hooks) {
2222
assert.strictEqual(response.status, 200);
2323
assert.deepEqual(await response.json(), {
2424
versions: [],
25+
meta: { total: 0, next_page: null },
2526
});
2627
});
2728

@@ -103,6 +104,37 @@ module('Mirage | GET /api/v1/crates/:id/versions', function (hooks) {
103104
yank_message: null,
104105
},
105106
],
107+
meta: { total: 3, next_page: null },
108+
});
109+
});
110+
111+
test('include `release_tracks` meta', async function (assert) {
112+
let user = this.server.create('user');
113+
let crate = this.server.create('crate', { name: 'rand' });
114+
this.server.create('version', { crate, num: '0.0.1' });
115+
this.server.create('version', { crate, num: '0.0.2', yanked: true });
116+
this.server.create('version', { crate, num: '1.0.0' });
117+
this.server.create('version', { crate, num: '1.1.0', publishedBy: user });
118+
this.server.create('version', { crate, num: '1.2.0', rust_version: '1.69', yanked: true });
119+
120+
let req = await fetch('/api/v1/crates/rand/versions');
121+
let expected = await req.json();
122+
123+
let response = await fetch('/api/v1/crates/rand/versions?include=release_tracks');
124+
assert.strictEqual(response.status, 200);
125+
assert.deepEqual(await response.json(), {
126+
...expected,
127+
meta: {
128+
...expected.meta,
129+
release_tracks: {
130+
'0.0': {
131+
highest: '0.0.1',
132+
},
133+
1: {
134+
highest: '1.1.0',
135+
},
136+
},
137+
},
106138
});
107139
});
108140
});

0 commit comments

Comments
 (0)