vike 0.4.144-commit-de18325 → 0.4.145
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 -5
- package/dist/cjs/node/runtime/renderPage/log404/index.js +2 -1
- package/dist/cjs/shared/route/noRouteMatch.js +4 -0
- package/dist/cjs/utils/isExternalLink.js +7 -0
- package/dist/cjs/utils/onPageVisibilityChange.js +19 -0
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/esm/client/client-routing-runtime/createPageContext.js +0 -1
- package/dist/esm/client/client-routing-runtime/getBaseServer.d.ts +2 -1
- package/dist/esm/client/client-routing-runtime/getBaseServer.js +2 -1
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +39 -0
- package/dist/esm/client/client-routing-runtime/{getPageContext.js → getPageContextFromHooks.js} +48 -74
- package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +0 -19
- package/dist/esm/client/client-routing-runtime/installClientRouter.js +11 -488
- package/dist/esm/client/client-routing-runtime/isClientSideRoutable.d.ts +3 -3
- package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +4 -7
- package/dist/esm/client/client-routing-runtime/navigate.js +2 -3
- package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.d.ts +4 -0
- package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +63 -0
- package/dist/esm/client/client-routing-runtime/onLinkClick.d.ts +2 -0
- package/dist/esm/client/client-routing-runtime/onLinkClick.js +40 -0
- package/dist/esm/client/client-routing-runtime/prefetch.js +7 -8
- package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +19 -0
- package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +347 -0
- package/dist/esm/client/client-routing-runtime/scrollRestoration.d.ts +6 -0
- package/dist/esm/client/client-routing-runtime/scrollRestoration.js +25 -0
- package/dist/esm/client/client-routing-runtime/setScrollPosition.d.ts +7 -0
- package/dist/esm/client/client-routing-runtime/setScrollPosition.js +77 -0
- package/dist/esm/client/client-routing-runtime/skipLink.js +9 -4
- package/dist/esm/client/client-routing-runtime/utils.d.ts +2 -0
- package/dist/esm/client/client-routing-runtime/utils.js +2 -0
- package/dist/esm/node/prerender/runPrerender.js +9 -5
- package/dist/esm/node/runtime/renderPage/log404/index.js +2 -1
- package/dist/esm/shared/route/noRouteMatch.d.ts +1 -0
- package/dist/esm/shared/route/noRouteMatch.js +1 -0
- package/dist/esm/utils/onPageVisibilityChange.d.ts +4 -0
- package/dist/esm/utils/onPageVisibilityChange.js +16 -0
- package/dist/esm/utils/projectInfo.d.ts +1 -1
- package/dist/esm/utils/projectInfo.js +1 -1
- package/package.json +1 -1
- package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +0 -28
- package/dist/esm/client/client-routing-runtime/navigationState.d.ts +0 -5
- package/dist/esm/client/client-routing-runtime/navigationState.js +0 -14
- /package/dist/esm/{client/client-routing-runtime → utils}/isExternalLink.d.ts +0 -0
- /package/dist/esm/{client/client-routing-runtime → utils}/isExternalLink.js +0 -0
|
@@ -49,6 +49,7 @@ const assertPathIsFilesystemAbsolute_js_1 = require("../../utils/assertPathIsFil
|
|
|
49
49
|
const abort_js_1 = require("../../shared/route/abort.js");
|
|
50
50
|
const loadPageFilesServerSide_js_1 = require("../runtime/renderPage/loadPageFilesServerSide.js");
|
|
51
51
|
const getHook_js_1 = require("../../shared/hooks/getHook.js");
|
|
52
|
+
const noRouteMatch_js_1 = require("../../shared/route/noRouteMatch.js");
|
|
52
53
|
async function prerenderFromAPI(options = {}) {
|
|
53
54
|
await runPrerender(options, 'prerender()');
|
|
54
55
|
}
|
|
@@ -450,7 +451,7 @@ async function routeAndPrerender(prerenderContext, htmlFiles, prerenderPageIds,
|
|
|
450
451
|
}
|
|
451
452
|
if (hookName) {
|
|
452
453
|
(0, utils_js_1.assert)(hookFilePath);
|
|
453
|
-
(0, utils_js_1.assertUsage)(false, `The ${hookName}() hook defined by ${hookFilePath} returns a URL ${picocolors_1.default.cyan(urlOriginal)} that
|
|
454
|
+
(0, utils_js_1.assertUsage)(false, `The ${hookName}() hook defined by ${hookFilePath} returns a URL ${picocolors_1.default.cyan(urlOriginal)} that ${noRouteMatch_js_1.noRouteMatch}. Make sure that the URLs returned by ${hookName}() always match the route of a page.`);
|
|
454
455
|
}
|
|
455
456
|
else {
|
|
456
457
|
// `prerenderHookFile` is `null` when the URL was deduced by the Filesytem Routing of `.page.js` files. The `onBeforeRoute()` can override Filesystem Routing; it is therefore expected that the deduced URL may not match any page.
|
|
@@ -514,15 +515,18 @@ function warnContradictoryNoPrerenderList(prerenderPageIds, doNotPrerenderList)
|
|
|
514
515
|
}
|
|
515
516
|
function warnMissingPages(prerenderPageIds, doNotPrerenderList, renderContext, partial) {
|
|
516
517
|
const isV1 = renderContext.pageConfigs.length > 0;
|
|
517
|
-
const hookName = isV1 ? '
|
|
518
|
-
|
|
518
|
+
const hookName = isV1 ? 'onBeforePrerenderStart' : 'prerender';
|
|
519
|
+
/* TODO/after-v1-design-release: document setting `prerender: false` as an alternative to using prerender.partial (both in the warnings and the docs)
|
|
520
|
+
const optOutName = isV1 ? 'prerender' : 'doNotPrerender'
|
|
521
|
+
const msgAddendum = `Explicitly opt-out by setting the config ${optOutName} to ${isV1 ? 'false' : 'true'} or use the option prerender.partial`
|
|
522
|
+
*/
|
|
519
523
|
renderContext.allPageIds
|
|
520
524
|
.filter((pageId) => !prerenderPageIds[pageId])
|
|
521
525
|
.filter((pageId) => !doNotPrerenderList.find((p) => p.pageId === pageId))
|
|
522
526
|
.filter((pageId) => !(0, error_page_js_1.isErrorPage)(pageId, renderContext.pageConfigs))
|
|
523
527
|
.forEach((pageId) => {
|
|
524
|
-
const pageAt =
|
|
525
|
-
(0, utils_js_1.assertWarning)(partial, `Cannot pre-render page ${pageAt} because it has a non-static route,
|
|
528
|
+
const pageAt = isV1 ? pageId : `\`${pageId}.page.*\``;
|
|
529
|
+
(0, utils_js_1.assertWarning)(partial, `Cannot pre-render page ${pageAt} because it has a non-static route, while no ${hookName}() hook returned any URL matching the page's route. You need to use a ${hookName}() hook (https://vike.dev/${hookName}) providing a list of URLs for ${pageAt} that should be pre-rendered. If you don't want to pre-render ${pageAt} then use the option prerender.partial (https://vike.dev/prerender-config#partial) to suppress this warning.`, { onlyOnce: true });
|
|
526
530
|
});
|
|
527
531
|
}
|
|
528
532
|
async function prerender404(htmlFiles, renderContext, prerenderContext) {
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getRoutesInfo = exports.log404 = void 0;
|
|
7
|
+
const noRouteMatch_js_1 = require("../../../../shared/route/noRouteMatch.js");
|
|
7
8
|
const globalContext_js_1 = require("../../globalContext.js");
|
|
8
9
|
const utils_js_1 = require("../../utils.js");
|
|
9
10
|
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
|
|
@@ -18,7 +19,7 @@ async function log404(pageContext) {
|
|
|
18
19
|
const globalContext = (0, globalContext_js_1.getGlobalContext)();
|
|
19
20
|
if (!globalContext.isProduction && !isFileRequest(urlPathname) && !pageContext.isClientSideNavigation) {
|
|
20
21
|
const routesInfo = getRoutesInfo(pageRoutes);
|
|
21
|
-
let msg = `URL ${picocolors_1.default.cyan(urlPathname)}
|
|
22
|
+
let msg = `URL ${picocolors_1.default.cyan(urlPathname)} ${noRouteMatch_js_1.noRouteMatch}`;
|
|
22
23
|
const outro = 'See https://vike.dev/routing for more information about routing.';
|
|
23
24
|
if (!routesInfo) {
|
|
24
25
|
msg = `${msg}. ${picocolors_1.default.dim(outro)}`;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isExternalLink = void 0;
|
|
4
|
+
function isExternalLink(url) {
|
|
5
|
+
return !url.startsWith('/') && !url.startsWith('.') && !url.startsWith('?') && url !== '';
|
|
6
|
+
}
|
|
7
|
+
exports.isExternalLink = isExternalLink;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.onPageShow = exports.onPageHide = void 0;
|
|
4
|
+
function onPageHide(listener) {
|
|
5
|
+
window.addEventListener('visibilitychange', () => {
|
|
6
|
+
if (document.visibilityState === 'hidden') {
|
|
7
|
+
listener();
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
exports.onPageHide = onPageHide;
|
|
12
|
+
function onPageShow(listener) {
|
|
13
|
+
window.addEventListener('visibilitychange', () => {
|
|
14
|
+
if (document.visibilityState === 'visible') {
|
|
15
|
+
listener();
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
exports.onPageShow = onPageShow;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.projectInfo = void 0;
|
|
4
4
|
const assertSingleInstance_js_1 = require("./assertSingleInstance.js");
|
|
5
|
-
const PROJECT_VERSION = '0.4.
|
|
5
|
+
const PROJECT_VERSION = '0.4.145';
|
|
6
6
|
const projectInfo = {
|
|
7
7
|
projectName: 'Vike',
|
|
8
8
|
projectVersion: PROJECT_VERSION,
|
|
@@ -22,7 +22,6 @@ async function createPageContext(urlOriginal) {
|
|
|
22
22
|
_urlRewrite: null,
|
|
23
23
|
_baseServer: baseServer,
|
|
24
24
|
_isProduction: isProd,
|
|
25
|
-
// TODO: use GlobalContext instead
|
|
26
25
|
_pageFilesAll: pageFilesAll,
|
|
27
26
|
_pageConfigs: pageConfigs,
|
|
28
27
|
_pageConfigGlobal: pageConfigGlobal,
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { getBaseServer };
|
|
2
|
+
declare function getBaseServer(): string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export { getBaseServer };
|
|
1
2
|
import { assert } from '../server-routing-runtime/utils.js';
|
|
2
|
-
|
|
3
|
+
function getBaseServer() {
|
|
3
4
|
// @ts-ignore Since dist/cjs/client/ is never used, we can ignore this error.
|
|
4
5
|
const baseServer = import.meta.env.BASE_SERVER;
|
|
5
6
|
assert(isBaseServer(baseServer));
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export { getPageContextFromHooks_firstRender };
|
|
2
|
+
export { getPageContextFromHooks_uponNavigation };
|
|
3
|
+
export { getPageContextFromHooks_errorPage };
|
|
4
|
+
export { isAlreadyServerSideRouted };
|
|
5
|
+
export type { PageContextFromHooks };
|
|
6
|
+
import type { PageContextExports, PageFile } from '../../shared/getPageFiles.js';
|
|
7
|
+
import type { PageContextUrlComputedPropsInternal } from '../../shared/addUrlComputedProps.js';
|
|
8
|
+
import type { PageContextForRoute } from '../../shared/route/index.js';
|
|
9
|
+
import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
|
|
10
|
+
import type { PageContextForPassToClientWarning } from '../shared/getPageContextProxyForUser.js';
|
|
11
|
+
/** - pageContext set by user hooks
|
|
12
|
+
* - pageContext set by loadPageFilesClientSide()
|
|
13
|
+
* - misc:
|
|
14
|
+
* - pageContext.isHydration
|
|
15
|
+
* - pageContext._pageId
|
|
16
|
+
* - pageContext._hasPageContextFromClient
|
|
17
|
+
* - pageContext._hasPageContextFromServer
|
|
18
|
+
*/
|
|
19
|
+
type PageContextFromHooks = {
|
|
20
|
+
_pageId: string;
|
|
21
|
+
isHydration: boolean;
|
|
22
|
+
_pageFilesLoaded: PageFile[];
|
|
23
|
+
} & PageContextExports & PageContextForPassToClientWarning;
|
|
24
|
+
type PageContext = PageContextUrlComputedPropsInternal & PageContextForRoute & {
|
|
25
|
+
_allPageIds: string[];
|
|
26
|
+
_pageFilesAll: PageFile[];
|
|
27
|
+
_pageConfigs: PageConfigRuntime[];
|
|
28
|
+
isBackwardNavigation: boolean | null;
|
|
29
|
+
};
|
|
30
|
+
declare function getPageContextFromHooks_firstRender(pageContext: {
|
|
31
|
+
urlOriginal: string;
|
|
32
|
+
} & PageContext): Promise<PageContextFromHooks>;
|
|
33
|
+
declare function getPageContextFromHooks_errorPage(pageContext: {
|
|
34
|
+
urlOriginal: string;
|
|
35
|
+
} & PageContext): Promise<PageContextFromHooks>;
|
|
36
|
+
declare function getPageContextFromHooks_uponNavigation(pageContext: {
|
|
37
|
+
_pageId: string;
|
|
38
|
+
} & PageContext): Promise<PageContextFromHooks>;
|
|
39
|
+
declare function isAlreadyServerSideRouted(err: unknown): boolean;
|
package/dist/esm/client/client-routing-runtime/{getPageContext.js → getPageContextFromHooks.js}
RENAMED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { getPageContextFromHooks_firstRender };
|
|
2
|
+
export { getPageContextFromHooks_uponNavigation };
|
|
3
|
+
export { getPageContextFromHooks_errorPage };
|
|
4
4
|
export { isAlreadyServerSideRouted };
|
|
5
|
-
import { navigationState } from './navigationState.js';
|
|
6
5
|
import { assert, assertUsage, hasProp, objectAssign, getProjectError, serverSideRouteTo, executeHook, isObject, getGlobalObject } from './utils.js';
|
|
7
6
|
import { parse } from '@brillout/json-serializer/parse';
|
|
8
7
|
import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
|
|
9
8
|
import { analyzePageServerSide } from '../../shared/getPageFiles/analyzePageServerSide.js';
|
|
10
|
-
import { route } from '../../shared/route/index.js';
|
|
11
9
|
import { getErrorPageId } from '../../shared/error-page.js';
|
|
12
10
|
import { getHook } from '../../shared/hooks/getHook.js';
|
|
13
11
|
import { preparePageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
|
|
@@ -19,85 +17,75 @@ import { assertOnBeforeRenderHookReturn } from '../../shared/assertOnBeforeRende
|
|
|
19
17
|
import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
|
|
20
18
|
import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
|
|
21
19
|
const globalObject = getGlobalObject('router/getPageContext.ts', {});
|
|
22
|
-
async function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return pageContextAddendum;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
const pageContextAddendum = await getPageContextUponNavigation(pageContext);
|
|
30
|
-
setPageContextInitHasClientData(pageContextAddendum);
|
|
31
|
-
return pageContextAddendum;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async function getPageContextFirstRender(pageContext) {
|
|
35
|
-
const pageContextAddendum = getPageContextSerializedInHtml();
|
|
36
|
-
removeBuiltInOverrides(pageContextAddendum);
|
|
37
|
-
objectAssign(pageContextAddendum, {
|
|
20
|
+
async function getPageContextFromHooks_firstRender(pageContext) {
|
|
21
|
+
const pageContextFromHooks = getPageContextSerializedInHtml();
|
|
22
|
+
removeBuiltInOverrides(pageContextFromHooks);
|
|
23
|
+
objectAssign(pageContextFromHooks, {
|
|
38
24
|
isHydration: true,
|
|
39
25
|
_hasPageContextFromClient: false
|
|
40
26
|
});
|
|
41
|
-
objectAssign(
|
|
27
|
+
objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContextFromHooks._pageId, pageContext));
|
|
42
28
|
{
|
|
43
|
-
const pageContextForHook = { ...pageContext, ...
|
|
29
|
+
const pageContextForHook = { ...pageContext, ...pageContextFromHooks };
|
|
44
30
|
if (await onBeforeRenderClientOnlyExists(pageContextForHook)) {
|
|
45
31
|
const pageContextFromHook = await executeOnBeforeRenderHookClientSide(pageContextForHook);
|
|
46
|
-
objectAssign(
|
|
32
|
+
objectAssign(pageContextFromHooks, pageContextFromHook);
|
|
47
33
|
}
|
|
48
34
|
}
|
|
49
|
-
|
|
35
|
+
setPageContextInitHasClientData(pageContextFromHooks);
|
|
36
|
+
return pageContextFromHooks;
|
|
50
37
|
}
|
|
51
|
-
async function
|
|
38
|
+
async function getPageContextFromHooks_errorPage(pageContext) {
|
|
52
39
|
const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
|
|
53
40
|
if (!errorPageId)
|
|
54
41
|
throw new Error('No error page defined.');
|
|
55
|
-
const
|
|
42
|
+
const pageContextFromHooks = {
|
|
56
43
|
isHydration: false,
|
|
57
44
|
_pageId: errorPageId
|
|
58
45
|
};
|
|
59
|
-
objectAssign(
|
|
60
|
-
return
|
|
46
|
+
objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, true));
|
|
47
|
+
return pageContextFromHooks;
|
|
61
48
|
}
|
|
62
|
-
async function
|
|
63
|
-
const
|
|
64
|
-
isHydration: false
|
|
49
|
+
async function getPageContextFromHooks_uponNavigation(pageContext) {
|
|
50
|
+
const pageContextFromHooks = {
|
|
51
|
+
isHydration: false,
|
|
52
|
+
_pageId: pageContext._pageId
|
|
65
53
|
};
|
|
66
|
-
objectAssign(
|
|
67
|
-
|
|
68
|
-
return
|
|
54
|
+
objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, false));
|
|
55
|
+
setPageContextInitHasClientData(pageContextFromHooks);
|
|
56
|
+
return pageContextFromHooks;
|
|
69
57
|
}
|
|
70
58
|
async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
|
|
71
|
-
let
|
|
72
|
-
objectAssign(
|
|
59
|
+
let pageContextFromHooks = {};
|
|
60
|
+
objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContext._pageId, pageContext));
|
|
73
61
|
// Needs to be called before any client-side hook, because it may contain pageContextInit.user which is needed for guard() and onBeforeRender()
|
|
74
62
|
if (
|
|
75
63
|
// For the error page, we cannot fetch pageContext from the server because the pageContext JSON request is based on the URL
|
|
76
64
|
!isErrorPage &&
|
|
77
|
-
(await hasPageContextServer({ ...pageContext, ...
|
|
65
|
+
(await hasPageContextServer({ ...pageContext, ...pageContextFromHooks }))) {
|
|
78
66
|
const pageContextFromServer = await fetchPageContextFromServer(pageContext);
|
|
79
67
|
if (!pageContextFromServer['_isError']) {
|
|
80
|
-
objectAssign(
|
|
68
|
+
objectAssign(pageContextFromHooks, pageContextFromServer);
|
|
81
69
|
}
|
|
82
70
|
else {
|
|
83
71
|
const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
|
|
84
72
|
assert(errorPageId);
|
|
85
|
-
|
|
86
|
-
objectAssign(
|
|
73
|
+
pageContextFromHooks = {};
|
|
74
|
+
objectAssign(pageContextFromHooks, {
|
|
87
75
|
isHydration: false,
|
|
88
76
|
_pageId: errorPageId
|
|
89
77
|
});
|
|
90
|
-
objectAssign(
|
|
78
|
+
objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContextFromHooks._pageId, pageContext));
|
|
91
79
|
assert(hasProp(pageContextFromServer, 'is404', 'boolean'));
|
|
92
80
|
assert(hasProp(pageContextFromServer, 'pageProps', 'object'));
|
|
93
81
|
assert(hasProp(pageContextFromServer.pageProps, 'is404', 'boolean'));
|
|
94
82
|
// When the user hasn't define a `_error.page.js` file: the mechanism with `serverSideError: true` is used instead
|
|
95
83
|
assert(!('serverSideError' in pageContextFromServer));
|
|
96
|
-
objectAssign(
|
|
84
|
+
objectAssign(pageContextFromHooks, pageContextFromServer);
|
|
97
85
|
}
|
|
98
86
|
}
|
|
99
87
|
else {
|
|
100
|
-
objectAssign(
|
|
88
|
+
objectAssign(pageContextFromHooks, { _hasPageContextFromServer: false });
|
|
101
89
|
// We don't need to call guard() on the client-side if we fetch pageContext from the server side. (Because the `${url}.pageContext.json` HTTP request will already trigger the routing and guard() hook on the serve-side.)
|
|
102
90
|
// We cannot call guard() before retrieving pageContext from server, since the server-side may define pageContextInit.user which is paramount for guard() hooks
|
|
103
91
|
if (!isErrorPage) {
|
|
@@ -105,41 +93,41 @@ async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
|
|
|
105
93
|
await executeGuardHook({
|
|
106
94
|
_hasPageContextFromClient: false,
|
|
107
95
|
...pageContext,
|
|
108
|
-
...
|
|
96
|
+
...pageContextFromHooks
|
|
109
97
|
}, (pageContext) => preparePageContextForUserConsumptionClientSide(pageContext, true));
|
|
110
98
|
}
|
|
111
99
|
}
|
|
112
100
|
{
|
|
113
101
|
// For the error page, we also execute the client-side onBeforeRender() hook, but maybe we shouldn't? The server-side does it as well (but maybe it shouldn't).
|
|
114
|
-
const
|
|
115
|
-
|
|
102
|
+
const pageContextFromOnBeforeRender = await executeOnBeforeRenderHookClientSide({
|
|
103
|
+
...pageContext,
|
|
104
|
+
...pageContextFromHooks
|
|
105
|
+
});
|
|
106
|
+
objectAssign(pageContextFromHooks, pageContextFromOnBeforeRender);
|
|
116
107
|
}
|
|
117
|
-
return
|
|
108
|
+
return pageContextFromHooks;
|
|
118
109
|
}
|
|
119
110
|
async function executeOnBeforeRenderHookClientSide(pageContext) {
|
|
120
111
|
const hook = getHook(pageContext, 'onBeforeRender');
|
|
121
112
|
if (!hook) {
|
|
122
|
-
const
|
|
113
|
+
const pageContextFromOnBeforeRender = {
|
|
123
114
|
_hasPageContextFromClient: false
|
|
124
115
|
};
|
|
125
|
-
return
|
|
116
|
+
return pageContextFromOnBeforeRender;
|
|
126
117
|
}
|
|
127
118
|
const onBeforeRender = hook.hookFn;
|
|
128
|
-
const
|
|
119
|
+
const pageContextFromOnBeforeRender = {
|
|
129
120
|
_hasPageContextFromClient: true
|
|
130
121
|
};
|
|
131
122
|
const pageContextForUserConsumption = preparePageContextForUserConsumptionClientSide({
|
|
132
123
|
...pageContext,
|
|
133
|
-
...
|
|
124
|
+
...pageContextFromOnBeforeRender
|
|
134
125
|
}, true);
|
|
135
126
|
const hookResult = await executeHook(() => onBeforeRender(pageContextForUserConsumption), 'onBeforeRender', hook.hookFilePath);
|
|
136
127
|
assertOnBeforeRenderHookReturn(hookResult, hook.hookFilePath);
|
|
137
128
|
const pageContextFromHook = hookResult?.pageContext;
|
|
138
|
-
objectAssign(
|
|
139
|
-
return
|
|
140
|
-
}
|
|
141
|
-
async function hasPageContextServer(pageContext) {
|
|
142
|
-
return !!globalObject.pageContextInitHasClientData || (await onBeforeRenderServerOnlyExists(pageContext));
|
|
129
|
+
objectAssign(pageContextFromOnBeforeRender, pageContextFromHook);
|
|
130
|
+
return pageContextFromOnBeforeRender;
|
|
143
131
|
}
|
|
144
132
|
// Workaround for the fact that the client-side cannot known whether a pageContext JSON request is needed in order to fetch pageContextInit data passed to the client.
|
|
145
133
|
// - The workaround is reliable as long as the user sets additional pageContextInit to undefined instead of not defining the property:
|
|
@@ -158,6 +146,9 @@ function setPageContextInitHasClientData(pageContext) {
|
|
|
158
146
|
globalObject.pageContextInitHasClientData = true;
|
|
159
147
|
}
|
|
160
148
|
}
|
|
149
|
+
async function hasPageContextServer(pageContext) {
|
|
150
|
+
return !!globalObject.pageContextInitHasClientData || (await onBeforeRenderServerOnlyExists(pageContext));
|
|
151
|
+
}
|
|
161
152
|
async function onBeforeRenderServerOnlyExists(pageContext) {
|
|
162
153
|
if (pageContext._pageConfigs.length > 0) {
|
|
163
154
|
// V1
|
|
@@ -182,23 +173,6 @@ async function onBeforeRenderClientOnlyExists(pageContext) {
|
|
|
182
173
|
return false;
|
|
183
174
|
}
|
|
184
175
|
}
|
|
185
|
-
async function getPageContextFromRoute(pageContext) {
|
|
186
|
-
const pageContextFromRoute = await route(pageContext);
|
|
187
|
-
// We'll be able to remove this once async route functions are deprecated (because we'll be able to skip link hijacking if a link doesn't match a route (because whether to call event.preventDefault() needs to be determined synchronously))
|
|
188
|
-
if (!pageContextFromRoute._pageId) {
|
|
189
|
-
const err = new Error('No routing match');
|
|
190
|
-
markIs404(err);
|
|
191
|
-
throw err;
|
|
192
|
-
}
|
|
193
|
-
assert(hasProp(pageContextFromRoute, '_pageId', 'string'));
|
|
194
|
-
return pageContextFromRoute;
|
|
195
|
-
}
|
|
196
|
-
function markIs404(err) {
|
|
197
|
-
objectAssign(err, { _is404: true });
|
|
198
|
-
}
|
|
199
|
-
function checkIf404(err) {
|
|
200
|
-
return isObject(err) && err._is404 === true;
|
|
201
|
-
}
|
|
202
176
|
async function fetchPageContextFromServer(pageContext) {
|
|
203
177
|
const pageContextUrl = getPageContextRequestUrl(pageContext._urlRewrite ?? pageContext.urlOriginal);
|
|
204
178
|
const response = await fetch(pageContextUrl);
|
|
@@ -1,21 +1,2 @@
|
|
|
1
1
|
export { installClientRouter };
|
|
2
|
-
export { disableClientRouting };
|
|
3
|
-
export { isDisableAutomaticLinkInterception };
|
|
4
|
-
export { renderPageClientSide };
|
|
5
|
-
import { ScrollPosition } from './history.js';
|
|
6
|
-
import { PageContextFromRewrite } from '../../shared/route/abort.js';
|
|
7
2
|
declare function installClientRouter(): void;
|
|
8
|
-
type RenderArgs = {
|
|
9
|
-
scrollTarget: ScrollTarget;
|
|
10
|
-
isBackwardNavigation: boolean | null;
|
|
11
|
-
urlOriginal?: string;
|
|
12
|
-
overwriteLastHistoryEntry?: boolean;
|
|
13
|
-
checkIfClientSideRenderable?: boolean;
|
|
14
|
-
pageContextsFromRewrite?: PageContextFromRewrite[];
|
|
15
|
-
redirectCount?: number;
|
|
16
|
-
isUserLandNavigation?: boolean;
|
|
17
|
-
};
|
|
18
|
-
declare function renderPageClientSide(renderArgs: RenderArgs): Promise<void>;
|
|
19
|
-
type ScrollTarget = ScrollPosition | 'scroll-to-top-or-hash' | 'preserve-scroll';
|
|
20
|
-
declare function isDisableAutomaticLinkInterception(): boolean;
|
|
21
|
-
declare function disableClientRouting(err: unknown, log: boolean): void;
|