vike 0.4.152-commit-6f928f9 → 0.4.153-commit-159c659
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/cli/bin.js +2 -2
- package/dist/cjs/node/plugin/index.js +2 -2
- package/dist/cjs/node/plugin/plugins/autoFullBuild.js +2 -2
- package/dist/cjs/node/plugin/plugins/envVars.js +1 -1
- package/dist/cjs/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +4 -4
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
- package/dist/cjs/node/prerender/index.js +1 -1
- package/dist/cjs/node/prerender/runPrerender.js +21 -13
- package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +5 -3
- package/dist/cjs/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +5 -5
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
- package/dist/cjs/node/runtime/renderPage.js +2 -2
- package/dist/cjs/shared/hooks/getHook.js +14 -8
- package/dist/cjs/shared/misc/isRenderFailure.js +4 -0
- package/dist/cjs/shared/misc/pageContextInitIsPassedToClient.js +4 -0
- package/dist/cjs/shared/route/abort.js +15 -4
- package/dist/cjs/shared/route/loadPageRoutes.js +1 -9
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +27 -32
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +39 -55
- package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +1 -1
- package/dist/esm/client/client-routing-runtime/installClientRouter.js +8 -2
- package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +2 -2
- package/dist/esm/client/client-routing-runtime/onLinkClick.js +2 -2
- package/dist/esm/client/client-routing-runtime/prefetch.js +2 -2
- package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +209 -141
- package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +2 -2
- package/dist/esm/client/server-routing-runtime/getPageContext.js +5 -4
- package/dist/esm/client/shared/getPageContextSerializedInHtml.d.ts +0 -1
- package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -4
- package/dist/esm/client/shared/{loadPageFilesClientSide.d.ts → loadUserFilesClientSide.d.ts} +7 -6
- package/dist/esm/client/shared/{loadPageFilesClientSide.js → loadUserFilesClientSide.js} +4 -4
- package/dist/esm/node/cli/bin.js +3 -3
- package/dist/esm/node/plugin/index.js +2 -2
- package/dist/esm/node/plugin/plugins/autoFullBuild.js +3 -3
- package/dist/esm/node/plugin/plugins/envVars.js +1 -1
- package/dist/esm/node/plugin/plugins/fileEnv.d.ts +3 -0
- package/dist/esm/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +3 -3
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
- package/dist/esm/node/prerender/index.d.ts +1 -1
- package/dist/esm/node/prerender/index.js +1 -1
- package/dist/esm/node/prerender/runPrerender.d.ts +8 -8
- package/dist/esm/node/prerender/runPrerender.js +22 -14
- package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +0 -1
- package/dist/esm/node/runtime/html/serializePageContextClientSide.js +5 -3
- package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.d.ts → loadUserFilesServerSide.d.ts} +6 -6
- package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +4 -4
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
- package/dist/esm/node/runtime/renderPage.js +2 -2
- package/dist/esm/shared/hooks/getHook.d.ts +2 -0
- package/dist/esm/shared/hooks/getHook.js +13 -7
- package/dist/esm/shared/misc/isRenderFailure.d.ts +1 -0
- package/dist/esm/shared/misc/isRenderFailure.js +1 -0
- package/dist/esm/shared/misc/pageContextInitIsPassedToClient.d.ts +1 -0
- package/dist/esm/shared/misc/pageContextInitIsPassedToClient.js +1 -0
- package/dist/esm/shared/route/abort.d.ts +1 -1
- package/dist/esm/shared/route/abort.js +16 -5
- package/dist/esm/shared/route/loadPageRoutes.js +1 -9
- package/dist/esm/utils/projectInfo.d.ts +2 -2
- package/dist/esm/utils/projectInfo.js +1 -1
- package/package.json +1 -1
- package/dist/esm/node/plugin/plugins/assertFileEnv.d.ts +0 -3
|
@@ -1,71 +1,50 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export { isServerSideRouted
|
|
1
|
+
export { getPageContextFromHooks_isHydration };
|
|
2
|
+
export { getPageContextFromHooks_isNotHydration };
|
|
3
|
+
export { getPageContextFromHooks_serialized };
|
|
4
|
+
export { isServerSideRouted };
|
|
5
5
|
import { assert, assertUsage, hasProp, objectAssign, getProjectError, serverSideRouteTo, executeHook, isObject, getGlobalObject } from './utils.js';
|
|
6
6
|
import { parse } from '@brillout/json-serializer/parse';
|
|
7
7
|
import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
|
|
8
8
|
import { analyzePageServerSide } from '../../shared/getPageFiles/analyzePageServerSide.js';
|
|
9
|
-
import { getErrorPageId } from '../../shared/error-page.js';
|
|
10
9
|
import { getHook } from '../../shared/hooks/getHook.js';
|
|
11
10
|
import { preparePageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
|
|
12
|
-
import { loadPageFilesClientSide } from '../shared/loadPageFilesClientSide.js';
|
|
13
11
|
import { removeBuiltInOverrides } from './getPageContext/removeBuiltInOverrides.js';
|
|
14
12
|
import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
|
|
15
13
|
import { getConfigValue, getPageConfig } from '../../shared/page-configs/helpers.js';
|
|
16
14
|
import { assertOnBeforeRenderHookReturn } from '../../shared/assertOnBeforeRenderHookReturn.js';
|
|
17
15
|
import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
|
|
18
16
|
import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
|
|
17
|
+
import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
|
|
18
|
+
import { isRenderFailure } from '../../shared/misc/isRenderFailure.js';
|
|
19
19
|
const globalObject = getGlobalObject('router/getPageContext.ts', {});
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
objectAssign(
|
|
24
|
-
|
|
25
|
-
_hasPageContextFromClient: false
|
|
20
|
+
function getPageContextFromHooks_serialized() {
|
|
21
|
+
const pageContextSerialized = getPageContextSerializedInHtml();
|
|
22
|
+
processPageContextFromServer(pageContextSerialized);
|
|
23
|
+
objectAssign(pageContextSerialized, {
|
|
24
|
+
_hasPageContextFromServer: true
|
|
26
25
|
});
|
|
27
|
-
|
|
26
|
+
return pageContextSerialized;
|
|
27
|
+
}
|
|
28
|
+
async function getPageContextFromHooks_isHydration(pageContext) {
|
|
29
|
+
const pageContextFromHooks = {
|
|
30
|
+
isHydration: true,
|
|
31
|
+
_hasPageContextFromClient: false,
|
|
32
|
+
_hasPageContextFromServer: true
|
|
33
|
+
};
|
|
28
34
|
for (const hookName of ['data', 'onBeforeRender']) {
|
|
29
35
|
const pageContextForHook = { ...pageContext, ...pageContextFromHooks };
|
|
30
36
|
if (hookClientOnlyExists(hookName, pageContextForHook)) {
|
|
31
37
|
const pageContextFromHook = await executeHookClientSide(hookName, pageContextForHook);
|
|
32
|
-
|
|
38
|
+
Object.assign(pageContextFromHooks, pageContextFromHook);
|
|
33
39
|
}
|
|
34
40
|
}
|
|
35
|
-
setPageContextInitHasClientData(pageContextFromHooks);
|
|
36
41
|
return pageContextFromHooks;
|
|
37
42
|
}
|
|
38
|
-
async function
|
|
39
|
-
const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
|
|
40
|
-
if (!errorPageId)
|
|
41
|
-
throw new Error('No error page defined.');
|
|
43
|
+
async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage) {
|
|
42
44
|
const pageContextFromHooks = {
|
|
43
45
|
isHydration: false,
|
|
44
|
-
|
|
45
|
-
};
|
|
46
|
-
objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, true));
|
|
47
|
-
return pageContextFromHooks;
|
|
48
|
-
}
|
|
49
|
-
async function getPageContextFromHooks_uponNavigation(pageContext) {
|
|
50
|
-
const pageContextFromHooks = {
|
|
51
|
-
isHydration: false,
|
|
52
|
-
_pageId: pageContext._pageId
|
|
53
|
-
};
|
|
54
|
-
objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, false));
|
|
55
|
-
setPageContextInitHasClientData(pageContextFromHooks);
|
|
56
|
-
return pageContextFromHooks;
|
|
57
|
-
}
|
|
58
|
-
async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
|
|
59
|
-
const getPageContextFromHooksInit = async (pageId) => {
|
|
60
|
-
const pageContextFromHooks = {
|
|
61
|
-
_hasPageContextFromClient: false,
|
|
62
|
-
_pageId: pageId
|
|
63
|
-
};
|
|
64
|
-
const pageContextFromPageFiles = await loadPageFilesClientSide(pageId, pageContext);
|
|
65
|
-
objectAssign(pageContextFromHooks, pageContextFromPageFiles);
|
|
66
|
-
return pageContextFromHooks;
|
|
46
|
+
_hasPageContextFromClient: false
|
|
67
47
|
};
|
|
68
|
-
let pageContextFromHooks = await getPageContextFromHooksInit(pageContext._pageId);
|
|
69
48
|
let hasPageContextFromServer = false;
|
|
70
49
|
// If pageContextInit has some client data or if one of the hooks guard(), data() or onBeforeRender() is server-side
|
|
71
50
|
// only, then we need to fetch pageContext from the server.
|
|
@@ -77,19 +56,20 @@ async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
|
|
|
77
56
|
(await hasPageContextServer({ ...pageContext, ...pageContextFromHooks }))) {
|
|
78
57
|
const pageContextFromServer = await fetchPageContextFromServer(pageContext);
|
|
79
58
|
hasPageContextFromServer = true;
|
|
80
|
-
if (!pageContextFromServer[
|
|
59
|
+
if (!pageContextFromServer[isRenderFailure] || isErrorPage) {
|
|
81
60
|
objectAssign(pageContextFromHooks, pageContextFromServer);
|
|
82
61
|
}
|
|
83
62
|
else {
|
|
84
|
-
|
|
85
|
-
assert(
|
|
86
|
-
pageContextFromHooks = await getPageContextFromHooksInit(errorPageId);
|
|
63
|
+
// When the user hasn't define a `_error.page.js` file: the mechanism with `serverSideError: true` is used instead
|
|
64
|
+
assert(!('serverSideError' in pageContextFromServer));
|
|
87
65
|
assert(hasProp(pageContextFromServer, 'is404', 'boolean'));
|
|
88
66
|
assert(hasProp(pageContextFromServer, 'pageProps', 'object'));
|
|
89
67
|
assert(hasProp(pageContextFromServer.pageProps, 'is404', 'boolean'));
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
68
|
+
objectAssign(pageContextFromServer, {
|
|
69
|
+
_hasPageContextFromServer: true,
|
|
70
|
+
_hasPageContextFromClient: false
|
|
71
|
+
});
|
|
72
|
+
return pageContextFromServer;
|
|
93
73
|
}
|
|
94
74
|
}
|
|
95
75
|
// At this point, we need to call the client-side guard(), data() and onBeforeRender() hooks, if they exist on client
|
|
@@ -172,14 +152,14 @@ async function executeHookClientSide(hookName, pageContext) {
|
|
|
172
152
|
// - We can show a warning to users when the pageContextInit keys aren't always the same. (We didn't implement the waning yet because it would require a new doc page https://vike.dev/pageContextInit#avoid-conditional-properties
|
|
173
153
|
// - Workaround cannot be made completely reliable because the workaround assumes that passToClient is always the same, but the user may set a different passToClient value for another page
|
|
174
154
|
// - Alternatively, we could define a new config `alwaysFetchPageContextFromServer: boolean`
|
|
175
|
-
function
|
|
176
|
-
if (pageContext
|
|
177
|
-
globalObject.
|
|
155
|
+
function setPageContextInitIsPassedToClient(pageContext) {
|
|
156
|
+
if (pageContext[pageContextInitIsPassedToClient]) {
|
|
157
|
+
globalObject.pageContextInitIsPassedToClient = true;
|
|
178
158
|
}
|
|
179
159
|
}
|
|
180
160
|
// TODO/v1-release: make it sync
|
|
181
161
|
async function hasPageContextServer(pageContext) {
|
|
182
|
-
return (!!globalObject.
|
|
162
|
+
return (!!globalObject.pageContextInitIsPassedToClient ||
|
|
183
163
|
(await hookServerOnlyExists('data', pageContext)) ||
|
|
184
164
|
(await hookServerOnlyExists('onBeforeRender', pageContext)));
|
|
185
165
|
}
|
|
@@ -251,9 +231,13 @@ async function fetchPageContextFromServer(pageContext) {
|
|
|
251
231
|
throw AbortRender(pageContextFromServer);
|
|
252
232
|
}
|
|
253
233
|
assert(hasProp(pageContextFromServer, '_pageId', 'string'));
|
|
254
|
-
|
|
234
|
+
processPageContextFromServer(pageContextFromServer);
|
|
255
235
|
return pageContextFromServer;
|
|
256
236
|
}
|
|
237
|
+
function processPageContextFromServer(pageContextFromServer) {
|
|
238
|
+
setPageContextInitIsPassedToClient(pageContextFromServer);
|
|
239
|
+
removeBuiltInOverrides(pageContextFromServer);
|
|
240
|
+
}
|
|
257
241
|
function isServerSideRouted(err) {
|
|
258
242
|
return isObject(err) && !!err._alreadyServerSideRouted;
|
|
259
243
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { installClientRouter };
|
|
2
|
-
declare function installClientRouter(): void
|
|
2
|
+
declare function installClientRouter(): Promise<void>;
|
|
@@ -6,17 +6,23 @@ import { onBrowserHistoryNavigation } from './onBrowserHistoryNavigation.js';
|
|
|
6
6
|
import { onLinkClick } from './onLinkClick.js';
|
|
7
7
|
import { setupNativeScrollRestoration } from './scrollRestoration.js';
|
|
8
8
|
import { autoSaveScrollPosition } from './setScrollPosition.js';
|
|
9
|
-
function installClientRouter() {
|
|
9
|
+
async function installClientRouter() {
|
|
10
10
|
setupNativeScrollRestoration();
|
|
11
11
|
initHistoryState();
|
|
12
12
|
autoSaveScrollPosition();
|
|
13
13
|
monkeyPatchHistoryPushState();
|
|
14
14
|
// First initial render
|
|
15
15
|
assert(getRenderCount() === 0);
|
|
16
|
-
renderPageClientSide({
|
|
16
|
+
const promise = renderPageClientSide({
|
|
17
|
+
scrollTarget: 'preserve-scroll',
|
|
18
|
+
isBackwardNavigation: null,
|
|
19
|
+
isClientSideNavigation: false
|
|
20
|
+
});
|
|
17
21
|
assert(getRenderCount() === 1);
|
|
18
22
|
// Intercept <a> links
|
|
19
23
|
onLinkClick();
|
|
20
24
|
// Handle back-/forward navigation
|
|
21
25
|
onBrowserHistoryNavigation();
|
|
26
|
+
// Only for full stack straces
|
|
27
|
+
await promise;
|
|
22
28
|
}
|
|
@@ -15,7 +15,7 @@ function onBrowserHistoryNavigation() {
|
|
|
15
15
|
// - The popstate event is *only* triggered if `href` starts with '#' (even if `href` is '/#some-hash' while the current URL's pathname is '/' then the popstate still isn't triggered)
|
|
16
16
|
// - By JavaScript: `location.hash = 'some-hash'`
|
|
17
17
|
// - The `event` argument of `window.addEventListener('popstate', (event) => /*...*/)` is useless: the History API doesn't provide the previous state (the popped state), see https://stackoverflow.com/questions/48055323/is-history-state-always-the-same-as-popstate-event-state
|
|
18
|
-
window.addEventListener('popstate', (
|
|
18
|
+
window.addEventListener('popstate', async () => {
|
|
19
19
|
const currentState = getState();
|
|
20
20
|
const scrollTarget = currentState.historyState.scrollPosition || 'scroll-to-top-or-hash';
|
|
21
21
|
const isUserLandPushStateNavigation = currentState.historyState.triggedBy === 'user';
|
|
@@ -48,7 +48,7 @@ function onBrowserHistoryNavigation() {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
51
|
-
renderPageClientSide({ scrollTarget, isBackwardNavigation, isUserLandPushStateNavigation });
|
|
51
|
+
await renderPageClientSide({ scrollTarget, isBackwardNavigation, isUserLandPushStateNavigation });
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
54
|
}
|
|
@@ -6,7 +6,7 @@ import { renderPageClientSide } from './renderPageClientSide.js';
|
|
|
6
6
|
function onLinkClick() {
|
|
7
7
|
document.addEventListener('click', handler);
|
|
8
8
|
}
|
|
9
|
-
function handler(ev) {
|
|
9
|
+
async function handler(ev) {
|
|
10
10
|
if (!isNormalLeftClick(ev))
|
|
11
11
|
return;
|
|
12
12
|
const linkTag = findLinkTag(ev.target);
|
|
@@ -19,7 +19,7 @@ function handler(ev) {
|
|
|
19
19
|
ev.preventDefault();
|
|
20
20
|
const keepScrollPosition = ![null, 'false'].includes(linkTag.getAttribute('keep-scroll-position'));
|
|
21
21
|
const scrollTarget = keepScrollPosition ? 'preserve-scroll' : 'scroll-to-top-or-hash';
|
|
22
|
-
renderPageClientSide({
|
|
22
|
+
await renderPageClientSide({
|
|
23
23
|
scrollTarget,
|
|
24
24
|
urlOriginal: url,
|
|
25
25
|
isBackwardNavigation: false
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { prefetch };
|
|
2
2
|
export { addLinkPrefetchHandlers };
|
|
3
3
|
import { assert, assertClientRouting, assertUsage, assertWarning, checkIfClientRouting, getGlobalObject, isExternalLink } from './utils.js';
|
|
4
|
-
import { isErrorFetchingStaticAssets,
|
|
4
|
+
import { isErrorFetchingStaticAssets, loadUserFilesClientSide } from '../shared/loadUserFilesClientSide.js';
|
|
5
5
|
import { skipLink } from './skipLink.js';
|
|
6
6
|
import { getPrefetchSettings } from './prefetch/getPrefetchSettings.js';
|
|
7
7
|
import { isAlreadyPrefetched, markAsAlreadyPrefetched } from './prefetch/alreadyPrefetched.js';
|
|
@@ -14,7 +14,7 @@ assertClientRouting();
|
|
|
14
14
|
const globalObject = getGlobalObject('prefetch.ts', { linkPrefetchHandlerAdded: new Map() });
|
|
15
15
|
async function prefetchAssets(pageId, pageContext) {
|
|
16
16
|
try {
|
|
17
|
-
await
|
|
17
|
+
await loadUserFilesClientSide(pageId, pageContext._pageFilesAll, pageContext._pageConfigs);
|
|
18
18
|
}
|
|
19
19
|
catch (err) {
|
|
20
20
|
if (isErrorFetchingStaticAssets(err)) {
|