1
- import fs from 'fs/promises'
1
+ import fs , { readFile } from 'fs/promises'
2
2
import { relative , resolve } from 'path'
3
3
4
4
// @ts -expect-error no types installed
5
5
import { patchFs } from 'fs-monkey'
6
+ import { type PrerenderManifest } from 'next/dist/build/index.js'
6
7
7
8
import { getRequestContext } from './handlers/request-context.cjs'
8
9
import { getTracer } from './handlers/tracer.cjs'
@@ -80,6 +81,30 @@ console.timeEnd('import next server')
80
81
81
82
type FS = typeof import ( 'fs' )
82
83
84
+ function normalizeStaticAssetPath ( path : string ) {
85
+ // just skip leading / for now
86
+ return path . replace ( / ^ \/ + / g, '' )
87
+ }
88
+
89
+ let fallbacks : Array < string > | undefined
90
+ async function isFallbackHTML ( relPath : string ) {
91
+ if ( ! fallbacks ) {
92
+ fallbacks = [ ]
93
+
94
+ try {
95
+ const prerenderManifest = JSON . parse (
96
+ await readFile ( resolve ( '.next/prerender-manifest.json' ) , 'utf-8' ) ,
97
+ ) as PrerenderManifest
98
+ fallbacks = Object . values ( prerenderManifest . dynamicRoutes )
99
+ . map ( ( route ) => route . fallback )
100
+ . filter ( ( fallback ) => typeof fallback === 'string' )
101
+ . map ( normalizeStaticAssetPath )
102
+ } catch { }
103
+ }
104
+
105
+ return fallbacks . includes ( normalizeStaticAssetPath ( relPath ) )
106
+ }
107
+
83
108
export async function getMockedRequestHandlers ( ...args : Parameters < typeof getRequestHandlers > ) {
84
109
const tracer = getTracer ( )
85
110
return tracer . withActiveSpan ( 'mocked request handler' , async ( ) => {
@@ -100,9 +125,11 @@ export async function getMockedRequestHandlers(...args: Parameters<typeof getReq
100
125
const relPath = relative ( resolve ( '.next/server/pages' ) , path )
101
126
const file = await store . get ( await encodeBlobKey ( relPath ) )
102
127
if ( file !== null ) {
103
- const requestContext = getRequestContext ( )
104
- if ( requestContext ) {
105
- requestContext . usedFsRead = true
128
+ if ( ! ( await isFallbackHTML ( relPath ) ) ) {
129
+ const requestContext = getRequestContext ( )
130
+ if ( requestContext ) {
131
+ requestContext . usedFsReadForNonFallback = true
132
+ }
106
133
}
107
134
108
135
return file
0 commit comments