vike 0.4.232 → 0.4.233
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/node/prerender/runPrerender.js +9 -4
- package/dist/cjs/node/runtime/renderPage/{executeOnBeforeRenderAndDataHooks.js → execHookDataAndOnBeforeRender.js} +2 -2
- package/dist/cjs/node/runtime/renderPage/{executeOnRenderHtmlHook.js → execHookOnRenderHtml.js} +3 -3
- package/dist/cjs/node/runtime/renderPage/execHookServer.js +1 -4
- package/dist/cjs/node/runtime/renderPage/loadPageConfigsLazyServerSide.js +18 -13
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -11
- package/dist/cjs/node/runtime/renderPage.js +55 -48
- package/dist/cjs/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +0 -2
- package/dist/cjs/shared/createPageContextShared.js +1 -3
- package/dist/cjs/shared/hooks/execHook.js +31 -54
- package/dist/cjs/shared/route/{executeGuardHook.js → execHookGuard.js} +3 -3
- package/dist/cjs/shared/route/{executeOnBeforeRouteHook.js → execHookOnBeforeRoute.js} +4 -4
- package/dist/cjs/shared/route/index.js +3 -2
- package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
- package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
- package/dist/cjs/utils/styleFileRE.js +1 -0
- package/dist/esm/client/runtime-client-routing/getPageContextFromHooks.d.ts +2 -2
- package/dist/esm/client/runtime-client-routing/getPageContextFromHooks.js +9 -9
- package/dist/esm/client/runtime-client-routing/renderPageClientSide.js +97 -62
- package/dist/esm/client/runtime-server-routing/createPageContextClientSide.js +11 -4
- package/dist/esm/client/runtime-server-routing/entry.js +2 -2
- package/dist/esm/client/shared/{executeOnRenderClientHook.d.ts → execHookOnRenderClient.d.ts} +2 -2
- package/dist/esm/client/shared/{executeOnRenderClientHook.js → execHookOnRenderClient.js} +4 -4
- package/dist/esm/client/shared/loadPageConfigsLazyClientSide.d.ts +12 -4
- package/dist/esm/client/shared/loadPageConfigsLazyClientSide.js +4 -4
- package/dist/esm/node/prerender/runPrerender.d.ts +250 -4
- package/dist/esm/node/prerender/runPrerender.js +11 -6
- package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/execHookDataAndOnBeforeRender.d.ts +6 -0
- package/dist/esm/node/runtime/renderPage/{executeOnBeforeRenderAndDataHooks.js → execHookDataAndOnBeforeRender.js} +2 -2
- package/dist/esm/node/runtime/renderPage/{executeOnRenderHtmlHook.d.ts → execHookOnRenderHtml.d.ts} +2 -2
- package/dist/esm/node/runtime/renderPage/{executeOnRenderHtmlHook.js → execHookOnRenderHtml.js} +4 -4
- package/dist/esm/node/runtime/renderPage/execHookServer.d.ts +3 -3
- package/dist/esm/node/runtime/renderPage/execHookServer.js +1 -4
- package/dist/esm/node/runtime/renderPage/getHttpResponseBody.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/loadPageConfigsLazyServerSide.d.ts +15 -6
- package/dist/esm/node/runtime/renderPage/loadPageConfigsLazyServerSide.js +18 -13
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +13 -13
- package/dist/esm/node/runtime/renderPage.js +57 -50
- package/dist/esm/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +0 -2
- package/dist/esm/shared/createPageContextShared.js +1 -3
- package/dist/esm/shared/hooks/execHook.d.ts +14 -28
- package/dist/esm/shared/hooks/execHook.js +31 -54
- package/dist/esm/shared/route/execHookGuard.d.ts +8 -0
- package/dist/esm/shared/route/{executeGuardHook.js → execHookGuard.js} +4 -4
- package/dist/esm/shared/route/{executeOnBeforeRouteHook.d.ts → execHookOnBeforeRoute.d.ts} +2 -2
- package/dist/esm/shared/route/{executeOnBeforeRouteHook.js → execHookOnBeforeRoute.js} +5 -5
- package/dist/esm/shared/route/index.js +3 -2
- package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
- package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/esm/utils/PROJECT_VERSION.js +1 -1
- package/dist/esm/utils/styleFileRE.js +1 -0
- package/package.json +1 -1
- package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +0 -6
- package/dist/esm/shared/route/executeGuardHook.d.ts +0 -8
|
@@ -13,7 +13,7 @@ import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.
|
|
|
13
13
|
import { getPageConfig } from '../../shared/page-configs/helpers.js';
|
|
14
14
|
import { getConfigValueRuntime } from '../../shared/page-configs/getConfigValueRuntime.js';
|
|
15
15
|
import { assertOnBeforeRenderHookReturn } from '../../shared/assertOnBeforeRenderHookReturn.js';
|
|
16
|
-
import {
|
|
16
|
+
import { execHookGuard } from '../../shared/route/execHookGuard.js';
|
|
17
17
|
import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
|
|
18
18
|
import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
|
|
19
19
|
import { isServerSideError } from '../../shared/misc/isServerSideError.js';
|
|
@@ -34,7 +34,7 @@ function getPageContextFromHooks_serialized() {
|
|
|
34
34
|
async function getPageContextFromHooks_isHydration(pageContext) {
|
|
35
35
|
for (const hookName of ['data', 'onBeforeRender']) {
|
|
36
36
|
if (hookClientOnlyExists(hookName, pageContext)) {
|
|
37
|
-
await
|
|
37
|
+
await execHookDataLike(hookName, pageContext);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
return pageContext;
|
|
@@ -78,7 +78,7 @@ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
|
|
|
78
78
|
!pageContext._hasPageContextFromServer) {
|
|
79
79
|
// Should we really call the guard() hook on the client-side? Shouldn't we make the guard() hook a server-side
|
|
80
80
|
// only hook? Or maybe make its env configurable like data() and onBeforeRender()?
|
|
81
|
-
await
|
|
81
|
+
await execHookGuard(pageContext, (pageContext) => preparePageContextForPublicUsageClient(pageContext));
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
else {
|
|
@@ -86,7 +86,7 @@ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
|
|
|
86
86
|
if (hookName === 'data')
|
|
87
87
|
dataHookExec = true;
|
|
88
88
|
// This won't do anything if no hook has been defined or if the hook's env.client is false.
|
|
89
|
-
await
|
|
89
|
+
await execHookDataLike(hookName, pageContext);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
}
|
|
@@ -101,17 +101,17 @@ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
|
|
|
101
101
|
async function execHookClient(hookName, pageContext) {
|
|
102
102
|
return await execHook(hookName, pageContext, (p) => preparePageContextForPublicUsageClient(p));
|
|
103
103
|
}
|
|
104
|
-
async function
|
|
104
|
+
async function execHookDataLike(hookName, pageContext) {
|
|
105
105
|
let pageContextFromHook;
|
|
106
106
|
if (hookName === 'data') {
|
|
107
|
-
pageContextFromHook = await
|
|
107
|
+
pageContextFromHook = await execHookData(pageContext);
|
|
108
108
|
}
|
|
109
109
|
else {
|
|
110
|
-
pageContextFromHook = await
|
|
110
|
+
pageContextFromHook = await execHookOnBeforeRender(pageContext);
|
|
111
111
|
}
|
|
112
112
|
Object.assign(pageContext, pageContextFromHook);
|
|
113
113
|
}
|
|
114
|
-
async function
|
|
114
|
+
async function execHookData(pageContext) {
|
|
115
115
|
const res = await execHookClient('data', pageContext);
|
|
116
116
|
const hook = res[0]; // TO-DO/soon: support cumulative
|
|
117
117
|
if (!hook)
|
|
@@ -120,7 +120,7 @@ async function executeDataHook(pageContext) {
|
|
|
120
120
|
const pageContextAddendum = { data: hookReturn };
|
|
121
121
|
return pageContextAddendum;
|
|
122
122
|
}
|
|
123
|
-
async function
|
|
123
|
+
async function execHookOnBeforeRender(pageContext) {
|
|
124
124
|
const res = await execHookClient('onBeforeRender', pageContext);
|
|
125
125
|
const hook = res[0]; // TO-DO/soon: support cumulative
|
|
126
126
|
if (!hook)
|
|
@@ -8,8 +8,8 @@ import { getPageContextFromClientHooks, getPageContextFromServerHooks, getPageCo
|
|
|
8
8
|
import { createPageContextClientSide } from './createPageContextClientSide.js';
|
|
9
9
|
import { addLinkPrefetchHandlers, addLinkPrefetchHandlers_unwatch, addLinkPrefetchHandlers_watch, getPageContextPrefetched, populatePageContextPrefetchCache, } from './prefetch.js';
|
|
10
10
|
import { assertInfo, assertWarning, isReact } from './utils.js';
|
|
11
|
-
import {
|
|
12
|
-
import { isErrorFetchingStaticAssets, loadPageConfigsLazyClientSide } from '../shared/loadPageConfigsLazyClientSide.js';
|
|
11
|
+
import { execHookOnRenderClient } from '../shared/execHookOnRenderClient.js';
|
|
12
|
+
import { isErrorFetchingStaticAssets, loadPageConfigsLazyClientSide, } from '../shared/loadPageConfigsLazyClientSide.js';
|
|
13
13
|
import { pushHistoryState } from './history.js';
|
|
14
14
|
import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled, } from '../../shared/route/abort.js';
|
|
15
15
|
import { route } from '../../shared/route/index.js';
|
|
@@ -20,7 +20,7 @@ import { getErrorPageId } from '../../shared/error-page.js';
|
|
|
20
20
|
import { setPageContextCurrent } from './getPageContextCurrent.js';
|
|
21
21
|
import { getRouteStringParameterList } from '../../shared/route/resolveRouteString.js';
|
|
22
22
|
import { getCurrentUrl } from '../shared/getCurrentUrl.js';
|
|
23
|
-
import {
|
|
23
|
+
import { execHookDirect, execHook } from '../../shared/hooks/execHook.js';
|
|
24
24
|
import { preparePageContextForPublicUsageClient, } from './preparePageContextForPublicUsageClient.js';
|
|
25
25
|
import { getHookFromPageContextNew } from '../../shared/hooks/getHook.js';
|
|
26
26
|
import { preparePageContextForPublicUsageClientMinimal } from '../shared/preparePageContextForPublicUsageClientShared.js';
|
|
@@ -60,7 +60,7 @@ async function renderPageClientSide(renderArgs) {
|
|
|
60
60
|
return;
|
|
61
61
|
async function renderPageNominal() {
|
|
62
62
|
const onError = async (err) => {
|
|
63
|
-
await
|
|
63
|
+
await renderPageOnError({ err });
|
|
64
64
|
};
|
|
65
65
|
const pageContext = await getPageContextBegin(false, pageContextBeginArgs);
|
|
66
66
|
if (isRenderOutdated())
|
|
@@ -73,9 +73,11 @@ async function renderPageClientSide(renderArgs) {
|
|
|
73
73
|
if (!globalObject.isTransitioning) {
|
|
74
74
|
globalObject.isTransitioning = true;
|
|
75
75
|
const hooks = getHookFromPageContextNew('onPageTransitionStart', previousPageContext);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
try {
|
|
77
|
+
await execHookDirect(hooks, pageContext, preparePageContextForPublicUsageClientMinimal);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
await onError(err);
|
|
79
81
|
return;
|
|
80
82
|
}
|
|
81
83
|
if (isRenderOutdated())
|
|
@@ -134,21 +136,17 @@ async function renderPageClientSide(renderArgs) {
|
|
|
134
136
|
assert(!('urlOriginal' in pageContextFromRoute));
|
|
135
137
|
objectAssign(pageContext, pageContextFromRoute);
|
|
136
138
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
// A user file has a syntax error
|
|
146
|
-
await onError(err);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (isRenderOutdated())
|
|
139
|
+
const res = await loadPageConfigsLazyClientSideAndExecHook(pageContext, isFirstRender, isRenderOutdated);
|
|
140
|
+
/* Already called inside loadPageConfigsLazyClientSideAndExecHook()
|
|
141
|
+
if (isRenderOutdated()) return
|
|
142
|
+
*/
|
|
143
|
+
if (res.skip)
|
|
151
144
|
return;
|
|
145
|
+
if ('err' in res) {
|
|
146
|
+
await onError(res.err);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
augmentType(pageContext, res.pageContext);
|
|
152
150
|
setPageContextCurrent(pageContext);
|
|
153
151
|
// Set global hydrationCanBeAborted
|
|
154
152
|
if (pageContext.exports.hydrationCanBeAborted) {
|
|
@@ -218,7 +216,11 @@ async function renderPageClientSide(renderArgs) {
|
|
|
218
216
|
await renderPageView(pageContext);
|
|
219
217
|
}
|
|
220
218
|
}
|
|
221
|
-
|
|
219
|
+
// When the normal page threw an error
|
|
220
|
+
// - Can be a URL rewrite upon `throw render('/some-url')`
|
|
221
|
+
// - Can be rendering the error page
|
|
222
|
+
// - Can be rendering Vike's generic error page (if no error page is defined, or if the error page throws an error)
|
|
223
|
+
async function renderPageOnError(args) {
|
|
222
224
|
const onError = (err) => {
|
|
223
225
|
if (!isSameErrorMessage(err, args.err)) {
|
|
224
226
|
/* When we can't render the error page, we prefer showing a blank page over letting the server-side try because otherwise:
|
|
@@ -247,8 +249,6 @@ async function renderPageClientSide(renderArgs) {
|
|
|
247
249
|
if (isRenderOutdated())
|
|
248
250
|
return;
|
|
249
251
|
objectAssign(pageContext, { routeParams: {} });
|
|
250
|
-
if (args.is404)
|
|
251
|
-
objectAssign(pageContext, { is404: true });
|
|
252
252
|
if (args.pageContextError)
|
|
253
253
|
objectAssign(pageContext, args.pageContextError);
|
|
254
254
|
if ('err' in args) {
|
|
@@ -313,21 +313,17 @@ async function renderPageClientSide(renderArgs) {
|
|
|
313
313
|
redirectHard(urlOriginal);
|
|
314
314
|
return;
|
|
315
315
|
}
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
// A user file has a syntax error
|
|
325
|
-
onError(err);
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
if (isRenderOutdated())
|
|
316
|
+
const res = await loadPageConfigsLazyClientSideAndExecHook(pageContext, isFirstRender, isRenderOutdated);
|
|
317
|
+
/* Already called inside loadPageConfigsLazyClientSideAndExecHook()
|
|
318
|
+
if (isRenderOutdated()) return
|
|
319
|
+
*/
|
|
320
|
+
if (res.skip)
|
|
330
321
|
return;
|
|
322
|
+
if ('err' in res) {
|
|
323
|
+
onError(res.err);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
augmentType(pageContext, res.pageContext);
|
|
331
327
|
setPageContextCurrent(pageContext);
|
|
332
328
|
let pageContextFromServerHooks;
|
|
333
329
|
try {
|
|
@@ -361,7 +357,7 @@ async function renderPageClientSide(renderArgs) {
|
|
|
361
357
|
async function renderPageView(pageContext, isErrorPage) {
|
|
362
358
|
const onError = async (err) => {
|
|
363
359
|
if (!isErrorPage) {
|
|
364
|
-
await
|
|
360
|
+
await renderPageOnError({ err });
|
|
365
361
|
}
|
|
366
362
|
else {
|
|
367
363
|
if (!isSameErrorMessage(err, isErrorPage.err)) {
|
|
@@ -383,7 +379,7 @@ async function renderPageClientSide(renderArgs) {
|
|
|
383
379
|
const onRenderClientPromise = (async () => {
|
|
384
380
|
let onRenderClientError;
|
|
385
381
|
try {
|
|
386
|
-
await
|
|
382
|
+
await execHookOnRenderClient(pageContext, preparePageContextForPublicUsageClient);
|
|
387
383
|
}
|
|
388
384
|
catch (err) {
|
|
389
385
|
onRenderClientError = err;
|
|
@@ -405,9 +401,11 @@ async function renderPageClientSide(renderArgs) {
|
|
|
405
401
|
*/
|
|
406
402
|
// onHydrationEnd()
|
|
407
403
|
if (isFirstRender && !onRenderClientError) {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
404
|
+
try {
|
|
405
|
+
await execHook('onHydrationEnd', pageContext, preparePageContextForPublicUsageClient);
|
|
406
|
+
}
|
|
407
|
+
catch (err) {
|
|
408
|
+
await onError(err);
|
|
411
409
|
if (!isErrorPage)
|
|
412
410
|
return;
|
|
413
411
|
}
|
|
@@ -422,9 +420,11 @@ async function renderPageClientSide(renderArgs) {
|
|
|
422
420
|
globalObject.isTransitioning = undefined;
|
|
423
421
|
assert(previousPageContext);
|
|
424
422
|
const hooks = getHookFromPageContextNew('onPageTransitionEnd', previousPageContext);
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
423
|
+
try {
|
|
424
|
+
await execHookDirect(hooks, pageContext, preparePageContextForPublicUsageClient);
|
|
425
|
+
}
|
|
426
|
+
catch (err) {
|
|
427
|
+
await onError(err);
|
|
428
428
|
if (!isErrorPage)
|
|
429
429
|
return;
|
|
430
430
|
}
|
|
@@ -491,22 +491,6 @@ function changeUrl(url, overwriteLastHistoryEntry) {
|
|
|
491
491
|
return;
|
|
492
492
|
pushHistoryState(url, overwriteLastHistoryEntry);
|
|
493
493
|
}
|
|
494
|
-
function handleErrorFetchingStaticAssets(err, pageContext, isFirstRender) {
|
|
495
|
-
if (!isErrorFetchingStaticAssets(err)) {
|
|
496
|
-
return false;
|
|
497
|
-
}
|
|
498
|
-
if (isFirstRender) {
|
|
499
|
-
disableClientRouting(err, false);
|
|
500
|
-
// This may happen if the frontend was newly deployed during hydration.
|
|
501
|
-
// Ideally: re-try a couple of times by reloading the page (not entirely trivial to implement since `localStorage` is needed.)
|
|
502
|
-
throw err;
|
|
503
|
-
}
|
|
504
|
-
else {
|
|
505
|
-
disableClientRouting(err, true);
|
|
506
|
-
}
|
|
507
|
-
redirectHard(pageContext.urlOriginal);
|
|
508
|
-
return true;
|
|
509
|
-
}
|
|
510
494
|
function disableClientRouting(err, log) {
|
|
511
495
|
assert(isErrorFetchingStaticAssets(err));
|
|
512
496
|
globalObject.clientRoutingIsDisabled = true;
|
|
@@ -596,3 +580,54 @@ function areKeysEqual(key1, key2) {
|
|
|
596
580
|
function getPageContextClient() {
|
|
597
581
|
return globalObject.renderedPageContext ?? null;
|
|
598
582
|
}
|
|
583
|
+
async function loadPageConfigsLazyClientSideAndExecHook(pageContext, isFirstRender, isRenderOutdated) {
|
|
584
|
+
let hasErr = false;
|
|
585
|
+
let err;
|
|
586
|
+
let pageContextAddendum;
|
|
587
|
+
try {
|
|
588
|
+
pageContextAddendum = await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._globalContext._pageConfigs, pageContext._globalContext._pageConfigGlobal);
|
|
589
|
+
}
|
|
590
|
+
catch (err_) {
|
|
591
|
+
err = err_;
|
|
592
|
+
hasErr = true;
|
|
593
|
+
if (handleErrorFetchingStaticAssets(err, pageContext, isFirstRender)) {
|
|
594
|
+
return { skip: true };
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
// Syntax error in user file
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
if (isRenderOutdated())
|
|
601
|
+
return { skip: true };
|
|
602
|
+
if (hasErr)
|
|
603
|
+
return { err };
|
|
604
|
+
objectAssign(pageContext, pageContextAddendum);
|
|
605
|
+
try {
|
|
606
|
+
await execHook('onCreatePageContext', pageContext, preparePageContextForPublicUsageClient);
|
|
607
|
+
}
|
|
608
|
+
catch (err_) {
|
|
609
|
+
err = err;
|
|
610
|
+
hasErr = true;
|
|
611
|
+
}
|
|
612
|
+
if (isRenderOutdated())
|
|
613
|
+
return { skip: true };
|
|
614
|
+
if (hasErr)
|
|
615
|
+
return { err };
|
|
616
|
+
return { pageContext };
|
|
617
|
+
}
|
|
618
|
+
function handleErrorFetchingStaticAssets(err, pageContext, isFirstRender) {
|
|
619
|
+
if (!isErrorFetchingStaticAssets(err)) {
|
|
620
|
+
return false;
|
|
621
|
+
}
|
|
622
|
+
if (isFirstRender) {
|
|
623
|
+
disableClientRouting(err, false);
|
|
624
|
+
// This may happen if the frontend was newly deployed during hydration.
|
|
625
|
+
// Ideally: re-try a couple of times by reloading the page (not entirely trivial to implement since `localStorage` is needed.)
|
|
626
|
+
throw err;
|
|
627
|
+
}
|
|
628
|
+
else {
|
|
629
|
+
disableClientRouting(err, true);
|
|
630
|
+
}
|
|
631
|
+
redirectHard(pageContext.urlOriginal);
|
|
632
|
+
return true;
|
|
633
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { createPageContextClientSide };
|
|
2
2
|
import { assertUsage, augmentType, objectAssign } from './utils.js';
|
|
3
3
|
import { getPageContextSerializedInHtml } from '../shared/getJsonSerializedInHtml.js';
|
|
4
|
-
import { loadPageConfigsLazyClientSide } from '../shared/loadPageConfigsLazyClientSide.js';
|
|
4
|
+
import { loadPageConfigsLazyClientSide, } from '../shared/loadPageConfigsLazyClientSide.js';
|
|
5
5
|
import { getCurrentUrl } from '../shared/getCurrentUrl.js';
|
|
6
6
|
import { createPageContextObject, createPageContextShared } from '../../shared/createPageContextShared.js';
|
|
7
7
|
import { getGlobalContextClientInternal } from './globalContext.js';
|
|
8
|
+
import { preparePageContextForPublicUsageClient, } from './preparePageContextForPublicUsageClient.js';
|
|
9
|
+
import { execHook } from '../../shared/hooks/execHook.js';
|
|
8
10
|
const urlFirst = getCurrentUrl({ withoutHash: true });
|
|
9
11
|
async function createPageContextClientSide() {
|
|
10
12
|
const globalContext = await getGlobalContextClientInternal();
|
|
@@ -20,10 +22,9 @@ async function createPageContextClientSide() {
|
|
|
20
22
|
});
|
|
21
23
|
objectAssign(pageContextCreated, getPageContextSerializedInHtml());
|
|
22
24
|
// Sets pageContext.config to global configs
|
|
23
|
-
|
|
24
|
-
augmentType(pageContextCreated, pageContextAugmented);
|
|
25
|
+
augmentType(pageContextCreated, await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal, globalContext._vikeConfigPublicGlobal));
|
|
25
26
|
// Sets pageContext.config to local configs (overrides the pageContext.config set above)
|
|
26
|
-
|
|
27
|
+
augmentType(pageContextCreated, await loadPageConfigsLazyClientSideAndExecHook(pageContextCreated));
|
|
27
28
|
assertPristineUrl();
|
|
28
29
|
return pageContextCreated;
|
|
29
30
|
}
|
|
@@ -31,3 +32,9 @@ function assertPristineUrl() {
|
|
|
31
32
|
const urlCurrent = getCurrentUrl({ withoutHash: true });
|
|
32
33
|
assertUsage(urlFirst === urlCurrent, `The URL was manipulated before the hydration finished ('${urlFirst}' to '${urlCurrent}'). Ensure the hydration has finished before manipulating the URL. Consider using the onHydrationEnd() hook.`);
|
|
33
34
|
}
|
|
35
|
+
async function loadPageConfigsLazyClientSideAndExecHook(pageContext) {
|
|
36
|
+
const pageContextAddendum = await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._globalContext._pageConfigs, pageContext._globalContext._pageConfigGlobal);
|
|
37
|
+
objectAssign(pageContext, pageContextAddendum);
|
|
38
|
+
await execHook('onCreatePageContext', pageContext, preparePageContextForPublicUsageClient);
|
|
39
|
+
return pageContext;
|
|
40
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { assertServerRouting } from '../../utils/assertRoutingType.js';
|
|
2
2
|
assertServerRouting();
|
|
3
3
|
import { createPageContextClientSide } from './createPageContextClientSide.js';
|
|
4
|
-
import {
|
|
4
|
+
import { execHookOnRenderClient } from '../shared/execHookOnRenderClient.js';
|
|
5
5
|
import { assertSingleInstance_onClientEntryServerRouting } from './utils.js';
|
|
6
6
|
import { removeFoucBuster } from '../shared/removeFoucBuster.js';
|
|
7
7
|
import { execHook } from '../../shared/hooks/execHook.js';
|
|
@@ -14,6 +14,6 @@ if (import.meta.env.DEV)
|
|
|
14
14
|
hydrate();
|
|
15
15
|
async function hydrate() {
|
|
16
16
|
const pageContext = await createPageContextClientSide();
|
|
17
|
-
await
|
|
17
|
+
await execHookOnRenderClient(pageContext, preparePageContextForPublicUsageClient);
|
|
18
18
|
await execHook('onHydrationEnd', pageContext, preparePageContextForPublicUsageClient);
|
|
19
19
|
}
|
package/dist/esm/client/shared/{executeOnRenderClientHook.d.ts → execHookOnRenderClient.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { execHookOnRenderClient };
|
|
2
2
|
export type { PageContextBeforeRenderClient };
|
|
3
3
|
import type { PageFile, VikeConfigPublicPageLazy } from '../../shared/getPageFiles.js';
|
|
4
4
|
import type { PageContextForPublicUsageClientShared } from './preparePageContextForPublicUsageClientShared.js';
|
|
@@ -10,4 +10,4 @@ type PageContextBeforeRenderClient = {
|
|
|
10
10
|
pageId: string;
|
|
11
11
|
_globalContext: GlobalContextClientInternalShared;
|
|
12
12
|
} & VikeConfigPublicPageLazy & PageContextForPublicUsageClientShared;
|
|
13
|
-
declare function
|
|
13
|
+
declare function execHookOnRenderClient<PageContext extends PageContextBeforeRenderClient>(pageContext: PageContext, prepareForPublicUsage: (pageConfig: PageContext) => PageContext): Promise<void>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { execHookOnRenderClient };
|
|
2
2
|
import { assert, assertUsage } from '../runtime-server-routing/utils.js';
|
|
3
3
|
import { getHookFromPageContext } from '../../shared/hooks/getHook.js';
|
|
4
|
-
import {
|
|
5
|
-
async function
|
|
4
|
+
import { execHookDirectSingle } from '../../shared/hooks/execHook.js';
|
|
5
|
+
async function execHookOnRenderClient(pageContext, prepareForPublicUsage) {
|
|
6
6
|
let hook = null;
|
|
7
7
|
{
|
|
8
8
|
const renderHook = getHookFromPageContext(pageContext, 'render');
|
|
@@ -38,7 +38,7 @@ async function executeOnRenderClientHook(pageContext, prepareForPublicUsage) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
// We don't use a try-catch wrapper because rendering errors are usually handled by the UI framework. (E.g. React's Error Boundaries.)
|
|
41
|
-
await
|
|
41
|
+
await execHookDirectSingle(hook, pageContext, prepareForPublicUsage);
|
|
42
42
|
}
|
|
43
43
|
function getUrlToShowToUser(pageContext) {
|
|
44
44
|
let url;
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
export { loadPageConfigsLazyClientSide };
|
|
2
|
+
export type { PageContext_loadPageConfigsLazyClientSide };
|
|
2
3
|
export { isErrorFetchingStaticAssets };
|
|
3
|
-
import { type PageFile
|
|
4
|
+
import { type PageFile } from '../../shared/getPageFiles.js';
|
|
4
5
|
import type { PageConfigGlobalRuntime, PageConfigRuntime } from '../../types/PageConfig.js';
|
|
5
|
-
type
|
|
6
|
-
|
|
6
|
+
type PageContext_loadPageConfigsLazyClientSide = {
|
|
7
|
+
pageId: string;
|
|
8
|
+
_pageFilesAll: PageFile[];
|
|
9
|
+
_globalContext: {
|
|
10
|
+
_pageConfigs: PageConfigRuntime[];
|
|
11
|
+
_pageConfigGlobal: PageConfigGlobalRuntime;
|
|
12
|
+
};
|
|
7
13
|
};
|
|
8
|
-
declare function loadPageConfigsLazyClientSide(pageId: string, pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[], pageConfigGlobal: PageConfigGlobalRuntime): Promise<
|
|
14
|
+
declare function loadPageConfigsLazyClientSide(pageId: string, pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[], pageConfigGlobal: PageConfigGlobalRuntime): Promise<import("../../shared/getPageFiles.js").VikeConfigPublicPageLazy & {
|
|
15
|
+
_pageFilesLoaded: PageFile[];
|
|
16
|
+
}>;
|
|
9
17
|
declare function isErrorFetchingStaticAssets(err: unknown): boolean;
|
|
@@ -5,7 +5,7 @@ import { resolveVikeConfigPublicPageLazy } from '../../shared/page-configs/resol
|
|
|
5
5
|
import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
|
|
6
6
|
import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
|
|
7
7
|
import { objectAssign } from '../runtime-server-routing/utils.js';
|
|
8
|
-
const
|
|
8
|
+
const errStamp = '_isAssetsError';
|
|
9
9
|
async function loadPageConfigsLazyClientSide(pageId, pageFilesAll, pageConfigs, pageConfigGlobal) {
|
|
10
10
|
const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
|
|
11
11
|
const pageConfig = findPageConfig(pageConfigs, pageId);
|
|
@@ -23,10 +23,10 @@ async function loadPageConfigsLazyClientSide(pageId, pageFilesAll, pageConfigs,
|
|
|
23
23
|
}
|
|
24
24
|
catch (err) {
|
|
25
25
|
if (isFetchError(err)) {
|
|
26
|
-
Object.assign(err, { [
|
|
26
|
+
Object.assign(err, { [errStamp]: true });
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
|
-
//
|
|
29
|
+
// Syntax error in user file
|
|
30
30
|
}
|
|
31
31
|
throw err;
|
|
32
32
|
}
|
|
@@ -40,7 +40,7 @@ function isErrorFetchingStaticAssets(err) {
|
|
|
40
40
|
if (!err) {
|
|
41
41
|
return false;
|
|
42
42
|
}
|
|
43
|
-
return err[
|
|
43
|
+
return err[errStamp] === true;
|
|
44
44
|
}
|
|
45
45
|
// https://stackoverflow.com/questions/75928310/how-to-detect-that-import-some-url-failed-because-some-url-isnt-a-javasc
|
|
46
46
|
function isFetchError(err) {
|