Skip to content

Commit a06794d

Browse files
authored
Merge pull request #2367 from inertiajs/prefetch-header
Send `Purpose: prefetch` header on prefetching
2 parents 9a75bbb + 6c8405b commit a06794d

File tree

3 files changed

+41
-19
lines changed

3 files changed

+41
-19
lines changed

packages/core/src/prefetched.ts

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { cloneDeep } from 'es-toolkit'
12
import { objectsAreEqual } from './objectUtils'
23
import { Response } from './response'
34
import { timeToMs } from './time'
@@ -205,23 +206,35 @@ class PrefetchedRequests {
205206
)
206207
}
207208

209+
protected withoutPurposePrefetchHeader(params: ActiveVisit): ActiveVisit {
210+
const newParams = cloneDeep(params)
211+
if (newParams.headers['Purpose'] === 'prefetch') {
212+
delete newParams.headers['Purpose']
213+
}
214+
return newParams
215+
}
216+
208217
protected paramsAreEqual(params1: ActiveVisit, params2: ActiveVisit): boolean {
209-
return objectsAreEqual<ActiveVisit>(params1, params2, [
210-
'showProgress',
211-
'replace',
212-
'prefetch',
213-
'onBefore',
214-
'onStart',
215-
'onProgress',
216-
'onFinish',
217-
'onCancel',
218-
'onSuccess',
219-
'onError',
220-
'onPrefetched',
221-
'onCancelToken',
222-
'onPrefetching',
223-
'async',
224-
])
218+
return objectsAreEqual<ActiveVisit>(
219+
this.withoutPurposePrefetchHeader(params1),
220+
this.withoutPurposePrefetchHeader(params2),
221+
[
222+
'showProgress',
223+
'replace',
224+
'prefetch',
225+
'onBefore',
226+
'onStart',
227+
'onProgress',
228+
'onFinish',
229+
'onCancel',
230+
'onSuccess',
231+
'onError',
232+
'onPrefetched',
233+
'onCancelToken',
234+
'onPrefetching',
235+
'async',
236+
],
237+
)
225238
}
226239
}
227240

packages/core/src/router.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ export class Router {
352352
mergedOptions.queryStringArrayFormat,
353353
)
354354

355-
return {
355+
const visit = {
356356
cancelled: false,
357357
completed: false,
358358
interrupted: false,
@@ -361,6 +361,12 @@ export class Router {
361361
url,
362362
data: _data,
363363
}
364+
365+
if (visit.prefetch) {
366+
visit.headers['Purpose'] = 'prefetch'
367+
}
368+
369+
return visit
364370
}
365371

366372
protected getVisitEvents(options: VisitOptions): VisitCallbacks {

tests/prefetch.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ test('will not prefetch current page', async ({ page }) => {
2626
await page.goto('prefetch/1')
2727

2828
// These two prefetch requests should be made on mount
29-
await prefetch2
30-
await prefetch4
29+
const request2 = await prefetch2
30+
const request4 = await prefetch4
31+
32+
expect(request2.request().headers().purpose).toBe('prefetch')
33+
expect(request4.request().headers().purpose).toBe('prefetch')
3134

3235
requests.listen(page)
3336
await page.getByRole('link', { name: 'On Hover (Default)' }).hover()

0 commit comments

Comments
 (0)