mirror of
https://github.com/vercel/next.js.git
synced 2026-09-20 02:25:18 +08:00
6a1b6336a3
The `revalidate` property of the `ctx` object that is passed into the incremental cache by the patched `fetch` as well as `unstable_cache` is unused since it was introduced in #43659. It was just added because of how the method signature for `set()` was changed back then. However, for those kinds of cache entries, the `revalidate` context property is never used, and instead the `revalidate` property of the passed-in `data` is used. To avoid further confusion (e.g. in [this question](https://github.com/vercel/next.js/pull/76207#discussion_r1968478141)), this PR improves the method signatures and types of the incremental cache so that the different call-site use cases can be clearly discriminated, and superfluous context properties can be omitted.
130 lines
3.0 KiB
TypeScript
130 lines
3.0 KiB
TypeScript
import { promises as fs } from 'node:fs'
|
|
import { fileURLToPath } from 'node:url'
|
|
import FileSystemCache from 'next/dist/server/lib/incremental-cache/file-system-cache'
|
|
import { nodeFs } from 'next/dist/server/lib/node-fs-methods'
|
|
import {
|
|
CachedRouteKind,
|
|
IncrementalCacheKind,
|
|
} from 'next/dist/server/response-cache'
|
|
|
|
const cacheDir = fileURLToPath(new URL('./cache', import.meta.url))
|
|
|
|
describe('FileSystemCache', () => {
|
|
it('set image route', async () => {
|
|
const fsCache = new FileSystemCache({
|
|
_requestHeaders: {},
|
|
flushToDisk: true,
|
|
fs: nodeFs,
|
|
serverDistDir: cacheDir,
|
|
revalidatedTags: [],
|
|
})
|
|
|
|
const binary = await fs.readFile(
|
|
fileURLToPath(new URL('./images/icon.png', import.meta.url))
|
|
)
|
|
|
|
await fsCache.set(
|
|
'icon.png',
|
|
{
|
|
body: binary,
|
|
headers: {
|
|
'Content-Type': 'image/png',
|
|
},
|
|
status: 200,
|
|
kind: CachedRouteKind.APP_ROUTE,
|
|
},
|
|
{}
|
|
)
|
|
|
|
expect(
|
|
(
|
|
await fsCache.get('icon.png', {
|
|
kind: IncrementalCacheKind.APP_ROUTE,
|
|
isFallback: undefined,
|
|
})
|
|
)?.value
|
|
).toEqual({
|
|
body: binary,
|
|
headers: {
|
|
'Content-Type': 'image/png',
|
|
},
|
|
status: 200,
|
|
kind: IncrementalCacheKind.APP_ROUTE,
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('FileSystemCache (isrMemory 0)', () => {
|
|
const fsCache = new FileSystemCache({
|
|
_requestHeaders: {},
|
|
flushToDisk: true,
|
|
fs: nodeFs,
|
|
serverDistDir: cacheDir,
|
|
revalidatedTags: [],
|
|
maxMemoryCacheSize: 0, // disable memory cache
|
|
})
|
|
|
|
it('should cache fetch', async () => {
|
|
await fsCache.set(
|
|
'fetch-cache',
|
|
{
|
|
kind: CachedRouteKind.FETCH,
|
|
data: {
|
|
headers: {},
|
|
body: 'MTcwMDA1NjM4MQ==',
|
|
status: 200,
|
|
url: 'http://my-api.local',
|
|
},
|
|
revalidate: 30,
|
|
},
|
|
{
|
|
fetchCache: true,
|
|
fetchUrl: 'http://my-api.local',
|
|
fetchIdx: 5,
|
|
tags: ['server-time'],
|
|
}
|
|
)
|
|
|
|
const res = await fsCache.get('fetch-cache', {
|
|
tags: ['server-time'],
|
|
kind: IncrementalCacheKind.FETCH,
|
|
})
|
|
|
|
expect(res?.value).toEqual({
|
|
kind: 'FETCH',
|
|
data: {
|
|
headers: {},
|
|
body: 'MTcwMDA1NjM4MQ==',
|
|
status: 200,
|
|
url: 'http://my-api.local',
|
|
},
|
|
revalidate: 30,
|
|
tags: ['server-time'],
|
|
})
|
|
})
|
|
|
|
it('should cache unstable_cache', async () => {
|
|
await fsCache.set(
|
|
'unstable-cache',
|
|
{
|
|
kind: CachedRouteKind.FETCH,
|
|
data: { headers: {}, body: '1700056381', status: 200, url: '' },
|
|
revalidate: 30,
|
|
},
|
|
{ fetchCache: true, tags: ['server-time2'] }
|
|
)
|
|
|
|
const res = await fsCache.get('unstable-cache', {
|
|
tags: ['server-time'],
|
|
kind: IncrementalCacheKind.FETCH,
|
|
})
|
|
|
|
expect(res?.value).toEqual({
|
|
kind: 'FETCH',
|
|
data: { headers: {}, body: '1700056381', status: 200, url: '' },
|
|
revalidate: 30,
|
|
tags: ['server-time2'],
|
|
})
|
|
})
|
|
})
|