Skip to content

Commit 90db007

Browse files
Simplify implementation (#9157)
Co-authored-by: Sergio Xalambrí <[email protected]>
1 parent aacff98 commit 90db007

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

packages/remix-server-runtime/single-fetch.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,22 @@ export type SingleFetchResults = {
3636
};
3737

3838
export function getSingleFetchDataStrategy(
39-
responseStubs: ReturnType<typeof getResponseStubs>
39+
responseStubs: ReturnType<typeof getResponseStubs>,
40+
{
41+
isActionDataRequest,
42+
loadRouteIds,
43+
}: { isActionDataRequest?: boolean; loadRouteIds?: string[] } = {}
4044
) {
4145
return async ({ request, matches }: DataStrategyFunctionArgs) => {
46+
// Don't call loaders on action data requests
47+
if (isActionDataRequest && request.method === "GET") {
48+
return await Promise.all(
49+
matches.map((m) =>
50+
m.resolve(async () => ({ type: "data", result: null }))
51+
)
52+
);
53+
}
54+
4255
let results = await Promise.all(
4356
matches.map(async (match) => {
4457
let responseStub: ResponseStub | undefined;
@@ -49,7 +62,11 @@ export function getSingleFetchDataStrategy(
4962
}
5063

5164
let result = await match.resolve(async (handler) => {
52-
let data = await handler({ response: responseStub });
65+
// Only run opt-in loaders when fine-grained revalidation is enabled
66+
let data =
67+
loadRouteIds && !loadRouteIds.includes(match.route.id)
68+
? null
69+
: await handler({ response: responseStub });
5370
return { type: "data", result: data };
5471
});
5572

@@ -96,8 +113,9 @@ export async function singleFetchAction(
96113
let result = await staticHandler.query(handlerRequest, {
97114
requestContext: loadContext,
98115
skipLoaderErrorBubbling: true,
99-
skipLoaders: true,
100-
unstable_dataStrategy: getSingleFetchDataStrategy(responseStubs),
116+
unstable_dataStrategy: getSingleFetchDataStrategy(responseStubs, {
117+
isActionDataRequest: true,
118+
}),
101119
});
102120

103121
// Unlike `handleDataRequest`, when singleFetch is enabled, queryRoute does
@@ -113,7 +131,9 @@ export async function singleFetchAction(
113131
let context = result;
114132

115133
let singleFetchResult: SingleFetchResult;
116-
let { statusCode, headers } = mergeResponseStubs(context, responseStubs);
134+
let { statusCode, headers } = mergeResponseStubs(context, responseStubs, {
135+
isActionDataRequest: true,
136+
});
117137

118138
if (isRedirectStatusCode(statusCode) && headers.has("Location")) {
119139
return {
@@ -176,9 +196,10 @@ export async function singleFetchLoaders(
176196
let responseStubs = getResponseStubs();
177197
let result = await staticHandler.query(handlerRequest, {
178198
requestContext: loadContext,
179-
loadRouteIds,
180199
skipLoaderErrorBubbling: true,
181-
unstable_dataStrategy: getSingleFetchDataStrategy(responseStubs),
200+
unstable_dataStrategy: getSingleFetchDataStrategy(responseStubs, {
201+
loadRouteIds,
202+
}),
182203
});
183204

184205
if (isResponse(result)) {
@@ -323,17 +344,20 @@ function proxyResponseToResponseStub(
323344

324345
export function mergeResponseStubs(
325346
context: StaticHandlerContext,
326-
responseStubs: ReturnType<typeof getResponseStubs>
347+
responseStubs: ReturnType<typeof getResponseStubs>,
348+
{ isActionDataRequest }: { isActionDataRequest?: boolean } = {}
327349
) {
328350
let statusCode: number | undefined = undefined;
329351
let headers = new Headers();
330352

331353
// Action followed by top-down loaders
332354
let actionStub = responseStubs[ResponseStubActionSymbol];
333-
let stubs = [
334-
actionStub,
335-
...context.matches.map((m) => responseStubs[m.route.id]),
336-
];
355+
let stubs = [actionStub];
356+
357+
// Nothing to merge at the route level on action data requests
358+
if (!isActionDataRequest) {
359+
stubs.push(...context.matches.map((m) => responseStubs[m.route.id]));
360+
}
337361

338362
for (let stub of stubs) {
339363
// Take the highest error/redirect, or the lowest success value - preferring

0 commit comments

Comments
 (0)