Skip to content

Commit 6c87377

Browse files
committed
fix: nested not serialized loaders
1 parent 9849dcf commit 6c87377

File tree

6 files changed

+47
-8
lines changed

6 files changed

+47
-8
lines changed

.changeset/smooth-cups-press.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik.dev/router': patch
3+
---
4+
5+
fix: nested not serialized loaders

packages/qwik-router/src/middleware/request-handler/middleware.request-handler.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import type { RenderOptions } from '@qwik.dev/core/server';
1717
import { RequestEvent as RequestEvent_2 } from '@qwik.dev/router/middleware/request-handler';
1818
import type { RequestHandler as RequestHandler_2 } from '@qwik.dev/router/middleware/request-handler';
1919
import type { ResolveSyncValue as ResolveSyncValue_2 } from '@qwik.dev/router/middleware/request-handler';
20-
import type { SerializationStrategy } from '@qwik.dev/core/internal';
20+
import { SerializationStrategy } from '@qwik.dev/core/internal';
2121
import type { _serialize } from '@qwik.dev/core/internal';
2222
import type { ValueOrPromise } from '@qwik.dev/core';
2323
import type { _verifySerializable } from '@qwik.dev/core/internal';

packages/qwik-router/src/middleware/request-handler/request-event.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { ValueOrPromise } from '@qwik.dev/core';
2-
import type { SerializationStrategy } from '@qwik.dev/core/internal';
2+
import { _UNINITIALIZED, type SerializationStrategy } from '@qwik.dev/core/internal';
33
import { QDATA_KEY } from '../../runtime/src/constants';
44
import {
55
LoadedRouteProp,
@@ -14,7 +14,7 @@ import { createCacheControl } from './cache-control';
1414
import { Cookie } from './cookie';
1515
import { ServerError } from './error-handler';
1616
import { AbortMessage, RedirectMessage } from './redirect-handler';
17-
import { encoder } from './resolve-request-handlers';
17+
import { encoder, getRouteLoaderPromise } from './resolve-request-handlers';
1818
import { RewriteMessage } from './rewrite-handler';
1919
import type {
2020
CacheControl,
@@ -150,7 +150,7 @@ export function createRequestEvent(
150150
return new AbortMessage();
151151
};
152152

153-
const loaders: Record<string, Promise<any>> = {};
153+
const loaders: Record<string, ValueOrPromise<unknown> | undefined> = {};
154154
const requestEv: RequestEventInternal = {
155155
[RequestEvLoaders]: loaders,
156156
[RequestEvLoaderSerializationStrategyMap]: new Map(),
@@ -210,6 +210,10 @@ export function createRequestEvent(
210210
'You can not get the returned data of a loader that has not been executed for this request.'
211211
);
212212
}
213+
if (loaders[id] === _UNINITIALIZED) {
214+
const isDev = getRequestMode(requestEv) === 'dev';
215+
await getRouteLoaderPromise(loaderOrAction, loaders, requestEv, isDev, qwikSerializer);
216+
}
213217
}
214218

215219
return loaders[id];

packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { type QRL } from '@qwik.dev/core';
2+
import { _UNINITIALIZED } from '@qwik.dev/core/internal';
23
import type { Render, RenderToStringResult } from '@qwik.dev/core/server';
34
import { QACTION_KEY, QFN_KEY, QLOADER_KEY } from '../../runtime/src/constants';
45
import {
@@ -23,8 +24,8 @@ import {
2324
RequestEvShareServerTiming,
2425
RequestEvSharedActionId,
2526
RequestRouteName,
26-
getRequestLoaders,
2727
getRequestLoaderSerializationStrategyMap,
28+
getRequestLoaders,
2829
getRequestMode,
2930
getRequestTrailingSlash,
3031
type RequestEventInternal,
@@ -38,7 +39,6 @@ import type {
3839
RequestHandler,
3940
} from './types';
4041
import { IsQData, QDATA_JSON } from './user-response';
41-
import { _UNINITIALIZED } from 'packages/qwik/core-internal';
4242

4343
export const resolveRequestHandlers = (
4444
serverPlugins: RouteModule[] | undefined,
@@ -248,6 +248,8 @@ export function loadersMiddleware(routeLoaders: LoaderInternal[]): RequestHandle
248248
for (const loader of routeLoaders) {
249249
if (selectedLoaderIds.includes(loader.__id)) {
250250
currentLoaders.push(loader);
251+
} else {
252+
loaders[loader.__id] = _UNINITIALIZED;
251253
}
252254
}
253255
} else {
@@ -261,7 +263,7 @@ export function loadersMiddleware(routeLoaders: LoaderInternal[]): RequestHandle
261263
};
262264
}
263265

264-
async function getRouteLoaderPromise(
266+
export async function getRouteLoaderPromise(
265267
loader: LoaderInternal,
266268
loaders: Record<string, unknown>,
267269
requestEv: RequestEventInternal,

starters/apps/qwikrouter-test/src/routes/loaders-serialization/index.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ export const useTestLoaderEager = routeLoader$(
1212
{ serializationStrategy: "always" },
1313
);
1414

15+
export const useNestedLoader = routeLoader$(async (requestEv) => {
16+
const testData = await requestEv.resolveValue(useTestLoader);
17+
return { test: testData.test + " nested", abcd: testData.abcd + " nested" };
18+
});
19+
1520
export default component$(() => {
1621
const testSignal = useTestLoader();
1722
const toggle = useSignal(false);
@@ -23,6 +28,7 @@ export default component$(() => {
2328
</button>
2429
{toggle.value && <Child />}
2530
{toggle.value && <ChildEager />}
31+
{toggle.value && <NestedChild />}
2632
</>
2733
);
2834
});
@@ -46,3 +52,13 @@ export const ChildEager = component$(() => {
4652
</>
4753
);
4854
});
55+
56+
export const NestedChild = component$(() => {
57+
const testSignal = useNestedLoader();
58+
return (
59+
<>
60+
<div id="prop5">{testSignal.value.test}</div>
61+
<div id="prop6">{testSignal.value.abcd}</div>
62+
</>
63+
);
64+
});

starters/e2e/qwikrouter/loaders.e2e.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ test.describe("loaders", () => {
178178
await expect(page.locator("#prop4")).toHaveText(
179179
"should serialize this",
180180
);
181+
await expect(page.locator("#prop5")).toHaveText(
182+
"some test value nested",
183+
);
184+
await expect(page.locator("#prop6")).toHaveText(
185+
"should not serialize this nested",
186+
);
181187
}
182188
});
183189

@@ -207,7 +213,7 @@ test.describe("loaders", () => {
207213
if (javaScriptEnabled) {
208214
await page.locator("#toggle-child").click();
209215
await page.waitForLoadState("networkidle");
210-
expect(loadersRequestCount).toBe(1);
216+
expect(loadersRequestCount).toBe(2);
211217
expect(allLoadersRequestCount).toBe(1);
212218
await expect(page.locator("#prop1")).toHaveText("some test value");
213219
await expect(page.locator("#prop2")).toHaveText(
@@ -219,6 +225,12 @@ test.describe("loaders", () => {
219225
await expect(page.locator("#prop4")).toHaveText(
220226
"should serialize this",
221227
);
228+
await expect(page.locator("#prop5")).toHaveText(
229+
"some test value nested",
230+
);
231+
await expect(page.locator("#prop6")).toHaveText(
232+
"should not serialize this nested",
233+
);
222234
}
223235
});
224236
}

0 commit comments

Comments
 (0)