Skip to content

Commit 698a82c

Browse files
committed
crate: findRecord requests for crate without including versions by default
This will ensure that the `versions` are fetched via a separate requests, rather than being included in the crate's response. This not only enables us to render the page layout first for a faster first paint but also allows us to migrate to a paginated version list in the future.
1 parent c4e851b commit 698a82c

File tree

7 files changed

+27
-29
lines changed

7 files changed

+27
-29
lines changed

app/adapters/crate.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ const BULK_REQUEST_GROUP_SIZE = 10;
55
export default class CrateAdapter extends ApplicationAdapter {
66
coalesceFindRequests = true;
77

8+
findRecord(store, type, id, snapshot) {
9+
let { include } = snapshot;
10+
// This ensures `crate.versions` are always fetched from another request.
11+
if (include === undefined) {
12+
snapshot.include = 'keywords,categories,downloads';
13+
}
14+
return super.findRecord(store, type, id, snapshot);
15+
}
16+
817
groupRecordsForFindMany(store, snapshots) {
918
let result = [];
1019
for (let i = 0; i < snapshots.length; i += BULK_REQUEST_GROUP_SIZE) {

e2e/acceptance/crate-dependencies.spec.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,6 @@ test.describe('Acceptance | crate dependencies page', { tag: '@acceptance' }, ()
7575
server.get('/api/v1/crates/:crate_name/versions', {}, 500);
7676
});
7777

78-
await ember.addHook(async owner => {
79-
// Load `crate` and then explicitly unload the side-loaded `versions`.
80-
let store = owner.lookup('service:store');
81-
let crateRecord = await store.findRecord('crate', 'foo');
82-
let versions = crateRecord.hasMany('versions').value();
83-
versions.forEach(record => record.unloadRecord());
84-
});
85-
8678
await page.goto('/crates/foo/1.0.0/dependencies');
8779

8880
await expect(page).toHaveURL('/crates/foo/1.0.0/dependencies');

e2e/routes/crate/range.spec.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,6 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => {
127127
server.get('/api/v1/crates/:crate_name/versions', {}, 500);
128128
});
129129

130-
await ember.addHook(async owner => {
131-
// Load `crate` and then explicitly unload the side-loaded `versions`.
132-
let store = owner.lookup('service:store');
133-
let crateRecord = await store.findRecord('crate', 'foo');
134-
let versions = crateRecord.hasMany('versions').value();
135-
versions.forEach(record => record.unloadRecord());
136-
});
137-
138130
await page.goto('/crates/foo/range/^3');
139131
await expect(page).toHaveURL('/crates/foo/range/%5E3');
140132
await expect(page.locator('[data-test-404-page]')).toBeVisible();

tests/acceptance/crate-dependencies-test.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,6 @@ module('Acceptance | crate dependencies page', function (hooks) {
7878

7979
this.server.get('/api/v1/crates/:crate_name/versions', {}, 500);
8080

81-
// Load `crate` and then explicitly unload the side-loaded `versions`.
82-
let store = this.owner.lookup('service:store');
83-
let crateRecord = await store.findRecord('crate', 'foo');
84-
let versions = crateRecord.hasMany('versions').value();
85-
versions.forEach(record => record.unloadRecord());
86-
8781
await visit('/crates/foo/1.0.0/dependencies');
8882
assert.strictEqual(currentURL(), '/crates/foo/1.0.0/dependencies');
8983
assert.dom('[data-test-404-page]').exists();

tests/adapters/crate-test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,21 @@ module('Adapter | crate', function (hooks) {
2222
assert.strictEqual(foo?.name, 'foo');
2323
assert.strictEqual(bar?.name, 'bar');
2424
});
25+
26+
test('findRecord requests do not include versions by default', async function (assert) {
27+
let _foo = this.server.create('crate', { name: 'foo' });
28+
let version = this.server.create('version', { crate: _foo });
29+
30+
let store = this.owner.lookup('service:store');
31+
32+
let foo = await store.findRecord('crate', 'foo');
33+
assert.strictEqual(foo?.name, 'foo');
34+
35+
// versions should not be loaded yet
36+
let versionsRef = foo.hasMany('versions');
37+
assert.deepEqual(versionsRef.ids(), []);
38+
39+
await versionsRef.load();
40+
assert.deepEqual(versionsRef.ids(), [version.id]);
41+
});
2542
});

tests/models/version-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ module('Model | Version', function (hooks) {
229229
this.server.create('version', { crate, num: '0.4.2' });
230230
this.server.create('version', { crate, num: '0.4.3', yanked: true });
231231
crateRecord = await this.store.findRecord('crate', crate.name, { reload: true });
232-
versions = (await crateRecord.loadVersionsTask.perform()).slice();
232+
versions = (await crateRecord.loadVersionsTask.perform({ reload: true })).slice();
233233

234234
assert.deepEqual(
235235
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),

tests/routes/crate/range-test.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,6 @@ module('Route | crate.range', function (hooks) {
119119

120120
this.server.get('/api/v1/crates/:crate_name/versions', {}, 500);
121121

122-
// Load `crate` and then explicitly unload the side-loaded `versions`.
123-
let store = this.owner.lookup('service:store');
124-
let crateRecord = await store.findRecord('crate', 'foo');
125-
let versions = crateRecord.hasMany('versions').value();
126-
versions.forEach(record => record.unloadRecord());
127-
128122
await visit('/crates/foo/range/^3');
129123
assert.strictEqual(currentURL(), '/crates/foo/range/%5E3');
130124
assert.dom('[data-test-404-page]').exists();

0 commit comments

Comments
 (0)