vike 0.4.252 → 0.4.253-commit-1658209
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/client/runtime-client-routing/createPageContextClient.d.ts +1 -1
- package/dist/client/runtime-client-routing/entry.js +0 -4
- package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +1 -1
- package/dist/client/runtime-client-routing/getPageContextCurrent.js +1 -1
- package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +12 -4
- package/dist/client/runtime-client-routing/getPageContextFromHooks.js +1 -1
- package/dist/client/runtime-client-routing/history.d.ts +1 -1
- package/dist/client/runtime-client-routing/history.js +2 -2
- package/dist/client/runtime-client-routing/initClientRouter.d.ts +1 -1
- package/dist/client/runtime-client-routing/initClientRouter.js +13 -6
- package/dist/client/runtime-client-routing/navigate.js +4 -3
- package/dist/client/runtime-client-routing/prefetch.js +1 -1
- package/dist/client/runtime-client-routing/renderPageClient.d.ts +4 -6
- package/dist/client/runtime-client-routing/renderPageClient.js +25 -19
- package/dist/client/runtime-client-routing/scrollRestoration.js +1 -1
- package/dist/client/runtime-client-routing/setScrollPosition.d.ts +3 -0
- package/dist/client/runtime-client-routing/setScrollPosition.js +6 -2
- package/dist/node/prerender/runPrerender.d.ts +6 -4
- package/dist/node/vite/plugins/pluginReplaceConstantsEnvVars.js +27 -12
- package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.d.ts +2 -0
- package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +1 -0
- package/dist/node/vite/shared/loggerVite.js +11 -4
- package/dist/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +7 -3
- package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +7 -2
- package/dist/server/runtime/globalContext.d.ts +10 -10
- package/dist/server/runtime/renderPageServer/addErrorHint.js +2 -1
- package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +9 -5
- package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +2 -2
- package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +5 -5
- package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +6 -4
- package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +24 -16
- package/dist/server/runtime/renderPageServer.d.ts +6 -4
- package/dist/shared-server-client/assertVirtualFileExports.js +3 -3
- package/dist/shared-server-client/createGlobalContextShared.d.ts +2 -2
- package/dist/shared-server-client/hooks/execHook.d.ts +13 -7
- package/dist/shared-server-client/hooks/execHook.js +1 -0
- package/dist/shared-server-client/hooks/getHook.d.ts +7 -7
- package/dist/shared-server-client/route/abort.js +1 -4
- package/dist/shared-server-client/route/loadPageRoutes.d.ts +3 -3
- package/dist/types/Config.d.ts +2 -5
- package/dist/types/PageContext.d.ts +2 -1
- package/dist/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/utils/PROJECT_VERSION.js +1 -1
- package/dist/utils/debug.js +8 -12
- package/dist/utils/isBrowser.d.ts +1 -0
- package/dist/utils/isBrowser.js +5 -3
- package/package.json +17 -17
|
@@ -66,7 +66,7 @@ declare function createPageContextClient(urlOriginal: string): Promise<{
|
|
|
66
66
|
isClientSide: true;
|
|
67
67
|
} & {
|
|
68
68
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
69
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
69
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
70
70
|
};
|
|
71
71
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
72
72
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic>;
|
|
@@ -4,11 +4,7 @@ assertClientRouting();
|
|
|
4
4
|
import { initClientRouter } from './initClientRouter.js';
|
|
5
5
|
import { assertSingleInstance_onClientEntryClientRouting } from '../../utils/assertSingleInstance.js';
|
|
6
6
|
import { removeFoucBuster } from '../shared/removeFoucBuster.js';
|
|
7
|
-
import { setVirtualFileExportsGlobalEntry } from '../shared/getGlobalContextClientInternalShared.js';
|
|
8
|
-
// @ts-expect-error
|
|
9
|
-
import * as virtualFileExportsGlobalEntry from 'virtual:vike:global-entry:client:client-routing';
|
|
10
7
|
assertSingleInstance_onClientEntryClientRouting(import.meta.env.PROD);
|
|
11
|
-
setVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry);
|
|
12
8
|
initClientRouter();
|
|
13
9
|
if (import.meta.env.DEV)
|
|
14
10
|
removeFoucBuster();
|
|
@@ -52,5 +52,5 @@ declare function getGlobalContextClientInternal(): Promise<{
|
|
|
52
52
|
isClientSide: true;
|
|
53
53
|
} & {
|
|
54
54
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
55
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
55
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
56
56
|
}>;
|
|
@@ -2,7 +2,7 @@ import '../assertEnvClient.js';
|
|
|
2
2
|
export { setPageContextCurrent };
|
|
3
3
|
export { getPageContextCurrent };
|
|
4
4
|
import { getGlobalObject } from '../../utils/getGlobalObject.js';
|
|
5
|
-
const globalObject = getGlobalObject('
|
|
5
|
+
const globalObject = getGlobalObject('getPageContextCurrent.ts', {
|
|
6
6
|
pageContextCurrent: null,
|
|
7
7
|
});
|
|
8
8
|
function getPageContextCurrent() {
|
|
@@ -84,7 +84,7 @@ declare function getPageContextFromHooksClient_firstRender(pageContext: PageCont
|
|
|
84
84
|
isClientSide: true;
|
|
85
85
|
} & {
|
|
86
86
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
87
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
87
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
88
88
|
};
|
|
89
89
|
_pageFilesAll: PageFile[];
|
|
90
90
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & {
|
|
@@ -162,7 +162,7 @@ declare function getPageContextFromHooksClient_firstRender(pageContext: PageCont
|
|
|
162
162
|
isClientSide: true;
|
|
163
163
|
} & {
|
|
164
164
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
165
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
165
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
166
166
|
};
|
|
167
167
|
_pageFilesAll: PageFile[];
|
|
168
168
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & import("../../shared-server-client/createPageContextShared.js").PageContextCreated & Omit<Partial<PageContextConfig & {
|
|
@@ -202,6 +202,8 @@ declare function getPageContextFromHooksClient_firstRender(pageContext: PageCont
|
|
|
202
202
|
}, "exports" | "pageId" | "config" | "Page" | "data" | "source" | "sources" | "from" | "configEntries" | "exportsAll" | "pageExports" | "routeParams" | "abortReason"> & {
|
|
203
203
|
isClientSide: true;
|
|
204
204
|
isPrerendering: false;
|
|
205
|
+
cspNonce?: undefined;
|
|
206
|
+
headers?: undefined;
|
|
205
207
|
} & {
|
|
206
208
|
urlOriginal: string;
|
|
207
209
|
isHydration: boolean;
|
|
@@ -263,6 +265,8 @@ declare function getPageContextFromHooksClient_firstRender(pageContext: PageCont
|
|
|
263
265
|
}, "exports" | "pageId" | "config" | "Page" | "data" | "source" | "sources" | "from" | "configEntries" | "exportsAll" | "pageExports" | "routeParams" | "abortReason"> & {
|
|
264
266
|
isClientSide: true;
|
|
265
267
|
isPrerendering: false;
|
|
268
|
+
cspNonce?: undefined;
|
|
269
|
+
headers?: undefined;
|
|
266
270
|
} & {
|
|
267
271
|
urlOriginal: string;
|
|
268
272
|
isHydration: boolean;
|
|
@@ -366,7 +370,7 @@ declare function getPageContextFromHooksClient(pageContext: {
|
|
|
366
370
|
isClientSide: true;
|
|
367
371
|
} & {
|
|
368
372
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
369
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
373
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
370
374
|
};
|
|
371
375
|
_pageFilesAll: PageFile[];
|
|
372
376
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & {
|
|
@@ -444,7 +448,7 @@ declare function getPageContextFromHooksClient(pageContext: {
|
|
|
444
448
|
isClientSide: true;
|
|
445
449
|
} & {
|
|
446
450
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
447
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
451
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
448
452
|
};
|
|
449
453
|
_pageFilesAll: PageFile[];
|
|
450
454
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & import("../../shared-server-client/createPageContextShared.js").PageContextCreated & Omit<Partial<PageContextConfig & {
|
|
@@ -484,6 +488,8 @@ declare function getPageContextFromHooksClient(pageContext: {
|
|
|
484
488
|
}, "exports" | "pageId" | "config" | "Page" | "data" | "source" | "sources" | "from" | "configEntries" | "exportsAll" | "pageExports" | "routeParams" | "abortReason"> & {
|
|
485
489
|
isClientSide: true;
|
|
486
490
|
isPrerendering: false;
|
|
491
|
+
cspNonce?: undefined;
|
|
492
|
+
headers?: undefined;
|
|
487
493
|
} & {
|
|
488
494
|
urlOriginal: string;
|
|
489
495
|
isHydration: boolean;
|
|
@@ -543,6 +549,8 @@ declare function getPageContextFromHooksClient(pageContext: {
|
|
|
543
549
|
}, "exports" | "pageId" | "config" | "Page" | "data" | "source" | "sources" | "from" | "configEntries" | "exportsAll" | "pageExports" | "routeParams" | "abortReason"> & {
|
|
544
550
|
isClientSide: true;
|
|
545
551
|
isPrerendering: false;
|
|
552
|
+
cspNonce?: undefined;
|
|
553
|
+
headers?: undefined;
|
|
546
554
|
} & {
|
|
547
555
|
urlOriginal: string;
|
|
548
556
|
isHydration: boolean;
|
|
@@ -24,7 +24,7 @@ import { pageContextInitIsPassedToClient } from '../../shared-server-client/misc
|
|
|
24
24
|
import { isServerSideError } from '../../shared-server-client/misc/isServerSideError.js';
|
|
25
25
|
import { execHook } from '../../shared-server-client/hooks/execHook.js';
|
|
26
26
|
import { getPageContextPublicClient } from './getPageContextPublicClient.js';
|
|
27
|
-
const globalObject = getGlobalObject('
|
|
27
|
+
const globalObject = getGlobalObject('getPageContextFromHooks.ts', {});
|
|
28
28
|
// TO-DO/soon/cumulative-hooks: filter & execute all client-only hooks (see other TO-DO/soon/cumulative-hooks comments)
|
|
29
29
|
// - The client-side needs to know what hooks are client-only
|
|
30
30
|
// - Possible implementation: new computed prop `clientOnlyHooks: string[]` (list of hook ids) and add `hookId` to serialized config values
|
|
@@ -17,7 +17,7 @@ type ScrollPosition = {
|
|
|
17
17
|
x: number;
|
|
18
18
|
y: number;
|
|
19
19
|
};
|
|
20
|
-
declare function saveScrollPosition(): void;
|
|
20
|
+
declare function saveScrollPosition(scrollPosition?: ScrollPosition): void;
|
|
21
21
|
declare function pushHistoryState(url: string, overwriteLastHistoryEntry: boolean): void;
|
|
22
22
|
declare function replaceHistoryStateOriginal(state: unknown, url?: Parameters<typeof window.history.replaceState>[2]): void;
|
|
23
23
|
type HistoryInfo = {
|
|
@@ -48,8 +48,8 @@ function getScrollPosition() {
|
|
|
48
48
|
function getTimestamp() {
|
|
49
49
|
return new Date().getTime();
|
|
50
50
|
}
|
|
51
|
-
function saveScrollPosition() {
|
|
52
|
-
|
|
51
|
+
function saveScrollPosition(scrollPosition) {
|
|
52
|
+
scrollPosition || (scrollPosition = getScrollPosition());
|
|
53
53
|
// Don't overwrite history.state if it was set by a non-Vike history.pushState() call.
|
|
54
54
|
// https://github.com/vikejs/vike/issues/2801#issuecomment-3490431479
|
|
55
55
|
if (!isEnhanced(window.history.state))
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '../assertEnvClient.js';
|
|
2
2
|
export { initClientRouter };
|
|
3
3
|
import { assert } from '../../utils/assert.js';
|
|
4
|
+
import { getGlobalObject } from '../../utils/getGlobalObject.js';
|
|
4
5
|
import { getRenderCount, renderPageClient } from './renderPageClient.js';
|
|
5
6
|
import { initOnPopState } from './initOnPopState.js';
|
|
6
7
|
import { initOnLinkClick } from './initOnLinkClick.js';
|
|
@@ -8,21 +9,27 @@ import { scrollRestoration_init } from './scrollRestoration.js';
|
|
|
8
9
|
import { autoSaveScrollPosition } from './setScrollPosition.js';
|
|
9
10
|
import { initLinkPrefetchHandlers } from './prefetch.js';
|
|
10
11
|
import { initHistory } from './history.js';
|
|
11
|
-
|
|
12
|
+
import { setVirtualFileExportsGlobalEntry } from '../shared/getGlobalContextClientInternalShared.js';
|
|
13
|
+
// @ts-expect-error
|
|
14
|
+
import * as virtualFileExportsGlobalEntry from 'virtual:vike:global-entry:client:client-routing';
|
|
15
|
+
const globalObject = getGlobalObject('initClientRouter.ts', {});
|
|
16
|
+
function initClientRouter() {
|
|
17
|
+
setVirtualFileExportsGlobalEntry(virtualFileExportsGlobalEntry);
|
|
18
|
+
if (globalObject.done)
|
|
19
|
+
return;
|
|
20
|
+
globalObject.done = true;
|
|
12
21
|
// Init navigation history and scroll restoration
|
|
13
22
|
initHistoryAndScroll();
|
|
14
23
|
// Render/hydrate
|
|
15
|
-
|
|
24
|
+
renderFirstPage();
|
|
16
25
|
// Intercept <a> clicks
|
|
17
26
|
initOnLinkClick();
|
|
18
27
|
// Add <a> prefetch handlers
|
|
19
28
|
initLinkPrefetchHandlers();
|
|
20
|
-
// Preserve stack track
|
|
21
|
-
await renderFirstPagePromise;
|
|
22
29
|
}
|
|
23
|
-
|
|
30
|
+
function renderFirstPage() {
|
|
24
31
|
assert(getRenderCount() === 0);
|
|
25
|
-
|
|
32
|
+
renderPageClient({
|
|
26
33
|
scrollTarget: { preserveScroll: true },
|
|
27
34
|
isClientSideNavigation: false,
|
|
28
35
|
});
|
|
@@ -4,8 +4,9 @@ export { reload };
|
|
|
4
4
|
// import { modifyUrlSameOrigin, ModifyUrlSameOriginOptions } from '../../shared/modifyUrlSameOrigin.js'
|
|
5
5
|
import { getCurrentUrl } from '../shared/getCurrentUrl.js';
|
|
6
6
|
import { normalizeUrlArgument } from './normalizeUrlArgument.js';
|
|
7
|
-
import {
|
|
7
|
+
import { renderPageClient } from './renderPageClient.js';
|
|
8
8
|
import { assertClientRouting } from '../../utils/assertRoutingType.js';
|
|
9
|
+
import { initClientRouter } from './initClientRouter.js';
|
|
9
10
|
assertClientRouting();
|
|
10
11
|
/** Programmatically navigate to a new page.
|
|
11
12
|
*
|
|
@@ -19,8 +20,8 @@ async function navigate(url, options) {
|
|
|
19
20
|
// let url = normalizeUrlArgument(options.url ?? getCurrentUrl(), 'navigate')
|
|
20
21
|
// url = modifyUrlSameOrigin(url, options)
|
|
21
22
|
normalizeUrlArgument(url, 'navigate');
|
|
22
|
-
//
|
|
23
|
-
|
|
23
|
+
// Ensure initClientRouter() is called before navigate() — otherwise race condition when +client.js calls navigate() before initClientRouter() is called in runtime-client-routing/entry.ts
|
|
24
|
+
initClientRouter();
|
|
24
25
|
const { keepScrollPosition, overwriteLastHistoryEntry, pageContext } = options ?? {};
|
|
25
26
|
const scrollTarget = { preserveScroll: keepScrollPosition ?? false };
|
|
26
27
|
await renderPageClient({
|
|
@@ -24,7 +24,7 @@ import { PAGE_CONTEXT_MAX_AGE_DEFAULT, getPrefetchSettings, } from './prefetch/g
|
|
|
24
24
|
import pc from '@brillout/picocolors';
|
|
25
25
|
import { normalizeUrlArgument } from './normalizeUrlArgument.js';
|
|
26
26
|
assertClientRouting();
|
|
27
|
-
const globalObject = getGlobalObject('
|
|
27
|
+
const globalObject = getGlobalObject('prefetch.ts', {
|
|
28
28
|
linkPrefetchHandlerAdded: new WeakSet(),
|
|
29
29
|
addLinkPrefetchHandlers_debounce: null,
|
|
30
30
|
mutationObserver: new MutationObserver(addLinkPrefetchHandlers),
|
|
@@ -2,7 +2,6 @@ import '../assertEnvClient.js';
|
|
|
2
2
|
export { renderPageClient };
|
|
3
3
|
export { getRenderCount };
|
|
4
4
|
export { disableClientRouting };
|
|
5
|
-
export { firstRenderStartPromise };
|
|
6
5
|
export { getPageContextClient };
|
|
7
6
|
export type { PageContextBegin };
|
|
8
7
|
export type { PageContextInternalClientAfterRender };
|
|
@@ -14,7 +13,6 @@ import type { PageContextClient } from '../../types/PageContext.js';
|
|
|
14
13
|
import { type PageContextPublicClient } from './getPageContextPublicClient.js';
|
|
15
14
|
import type { VikeGlobalInternal } from '../../types/VikeGlobalInternal.js';
|
|
16
15
|
type PageContextInternalClientAfterRender = NonNullable<Awaited<ReturnType<typeof renderPageClient>>>;
|
|
17
|
-
declare const firstRenderStartPromise: Promise<void>;
|
|
18
16
|
type PreviousPageContext = {
|
|
19
17
|
pageId: string;
|
|
20
18
|
} & PageContextConfig & PageContextRouted & PageContextCreatedClient & PageContextPublicClient;
|
|
@@ -105,7 +103,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
|
|
|
105
103
|
isClientSide: true;
|
|
106
104
|
} & {
|
|
107
105
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
108
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
106
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
109
107
|
};
|
|
110
108
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
111
109
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & PageContextConfig & {
|
|
@@ -200,7 +198,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
|
|
|
200
198
|
isClientSide: true;
|
|
201
199
|
} & {
|
|
202
200
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
203
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
201
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
204
202
|
};
|
|
205
203
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
206
204
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & PageContextConfig & {
|
|
@@ -296,7 +294,7 @@ declare function renderPageClient(renderArgs: RenderArgs): Promise<({
|
|
|
296
294
|
isClientSide: true;
|
|
297
295
|
} & {
|
|
298
296
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
299
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
297
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
300
298
|
};
|
|
301
299
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
302
300
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & PageContextConfig & {
|
|
@@ -395,7 +393,7 @@ declare function getPageContextBegin(isForErrorPage: boolean, { urlOriginal, isB
|
|
|
395
393
|
isClientSide: true;
|
|
396
394
|
} & {
|
|
397
395
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
398
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
396
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
399
397
|
};
|
|
400
398
|
_pageFilesAll: import("../../shared-server-client/getPageFiles.js").PageFile[];
|
|
401
399
|
} & import("../../shared-server-client/page-configs/resolveVikeConfigPublic.js").GlobalConfigPublic & {
|
|
@@ -2,7 +2,6 @@ import '../assertEnvClient.js';
|
|
|
2
2
|
export { renderPageClient };
|
|
3
3
|
export { getRenderCount };
|
|
4
4
|
export { disableClientRouting };
|
|
5
|
-
export { firstRenderStartPromise };
|
|
6
5
|
export { getPageContextClient };
|
|
7
6
|
import { assert, assertInfo, assertWarning } from '../../utils/assert.js';
|
|
8
7
|
import { catchInfiniteLoop } from '../../utils/catchInfiniteLoop.js';
|
|
@@ -19,11 +18,11 @@ import { createPageContextClient } from './createPageContextClient.js';
|
|
|
19
18
|
import { addLinkPrefetchHandlers, addLinkPrefetchHandlers_unwatch, addLinkPrefetchHandlers_watch, getPageContextPrefetched, populatePageContextPrefetchCache, } from './prefetch.js';
|
|
20
19
|
import { execHookOnRenderClient } from '../shared/execHookOnRenderClient.js';
|
|
21
20
|
import { isErrorFetchingStaticAssets, loadPageConfigsLazyClientSide, } from '../shared/loadPageConfigsLazyClientSide.js';
|
|
22
|
-
import { pushHistoryState } from './history.js';
|
|
21
|
+
import { pushHistoryState, saveScrollPosition } from './history.js';
|
|
23
22
|
import { addNewPageContextAborted, getPageContextAddendumAbort, isAbortError, logAbort, } from '../../shared-server-client/route/abort.js';
|
|
24
23
|
import { route } from '../../shared-server-client/route/index.js';
|
|
25
24
|
import { isClientSideRoutable } from './isClientSideRoutable.js';
|
|
26
|
-
import { setScrollPosition } from './setScrollPosition.js';
|
|
25
|
+
import { isScrollPosition, setScrollPosition } from './setScrollPosition.js';
|
|
27
26
|
import { scrollRestoration_initialRenderIsDone } from './scrollRestoration.js';
|
|
28
27
|
import { getErrorPageId, isErrorPage } from '../../shared-server-client/error-page.js';
|
|
29
28
|
import { setPageContextCurrent } from './getPageContextCurrent.js';
|
|
@@ -34,15 +33,14 @@ import { getPageContextPublicClient } from './getPageContextPublicClient.js';
|
|
|
34
33
|
import { getHooksFromPageContextNew } from '../../shared-server-client/hooks/getHook.js';
|
|
35
34
|
import { getPageContextPublicClientMinimal } from '../shared/getPageContextPublicClientShared.js';
|
|
36
35
|
import { logErrorClient } from './logErrorClient.js';
|
|
37
|
-
const globalObject = getGlobalObject('
|
|
38
|
-
const { promise:
|
|
36
|
+
const globalObject = getGlobalObject('renderPageClient.ts', (() => {
|
|
37
|
+
const { promise: hydrationAwaitPromise, resolve: hydrationAwaitPromiseResolve } = genPromise();
|
|
39
38
|
return {
|
|
40
39
|
renderCounter: 0,
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
hydrationAwaitPromise,
|
|
41
|
+
hydrationAwaitPromiseResolve,
|
|
43
42
|
};
|
|
44
43
|
})());
|
|
45
|
-
const { firstRenderStartPromise } = globalObject;
|
|
46
44
|
async function renderPageClient(renderArgs) {
|
|
47
45
|
catchInfiniteLoop('renderPageClient()');
|
|
48
46
|
const { urlOriginal = getCurrentUrl(), overwriteLastHistoryEntry = false, isBackwardNavigation = false, isHistoryNavigation = false, doNotRenderIfSamePage, isClientSideNavigation = true, pageContextInitClient, pageContextsAborted = [], } = renderArgs;
|
|
@@ -63,7 +61,15 @@ async function renderPageClient(renderArgs) {
|
|
|
63
61
|
redirectHard(urlOriginal);
|
|
64
62
|
return;
|
|
65
63
|
}
|
|
66
|
-
|
|
64
|
+
// Await hydration (unless +hydrationCanBeAborted)
|
|
65
|
+
if (!isFirstRender) {
|
|
66
|
+
await globalObject.hydrationAwaitPromise;
|
|
67
|
+
if (isRenderOutdated())
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Ensure no concurrent onRenderClient() calls.
|
|
71
|
+
// - We could `await globalObject.onRenderClientPreviousPromise` later just before execHookOnRenderClient() but we prefer doing it early to ensure `getPageContext() === usePageContext()` (and maybe it prevents other potential inconsistencies?).
|
|
72
|
+
await globalObject.onRenderClientPreviousPromise;
|
|
67
73
|
if (isRenderOutdated())
|
|
68
74
|
return;
|
|
69
75
|
return await renderPageNominal();
|
|
@@ -175,7 +181,9 @@ async function renderPageClient(renderArgs) {
|
|
|
175
181
|
setHydrationCanBeAborted();
|
|
176
182
|
}
|
|
177
183
|
else {
|
|
178
|
-
|
|
184
|
+
if (globalThis.__VIKE__IS_DEV) {
|
|
185
|
+
assertWarning(!isReact(), 'You seem to be using React; we recommend setting hydrationCanBeAborted to true, see https://vike.dev/hydrationCanBeAborted', { onlyOnce: true });
|
|
186
|
+
}
|
|
179
187
|
}
|
|
180
188
|
// There wasn't any `await` but the isRenderOutdated() return value may have changed because we called setHydrationCanBeAborted()
|
|
181
189
|
if (isRenderOutdated())
|
|
@@ -396,16 +404,9 @@ async function renderPageClient(renderArgs) {
|
|
|
396
404
|
logErrorClient(err);
|
|
397
405
|
}
|
|
398
406
|
};
|
|
399
|
-
// We use globalObject.onRenderClientPreviousPromise in order to ensure that there is never two concurrent onRenderClient() calls
|
|
400
|
-
if (globalObject.onRenderClientPreviousPromise) {
|
|
401
|
-
// Make sure that the previous render has finished
|
|
402
|
-
await globalObject.onRenderClientPreviousPromise;
|
|
403
|
-
assert(globalObject.onRenderClientPreviousPromise === undefined);
|
|
404
|
-
if (isRenderOutdated())
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
407
|
changeUrl(urlOriginal, overwriteLastHistoryEntry);
|
|
408
408
|
globalObject.previousPageContext = pageContext;
|
|
409
|
+
// There should never be concurrent onRenderClient() calls
|
|
409
410
|
assert(globalObject.onRenderClientPreviousPromise === undefined);
|
|
410
411
|
const onRenderClientPromise = (async () => {
|
|
411
412
|
let onRenderClientError;
|
|
@@ -422,7 +423,6 @@ async function renderPageClient(renderArgs) {
|
|
|
422
423
|
})();
|
|
423
424
|
globalObject.onRenderClientPreviousPromise = onRenderClientPromise;
|
|
424
425
|
const onRenderClientError = await onRenderClientPromise;
|
|
425
|
-
assert(globalObject.onRenderClientPreviousPromise === undefined);
|
|
426
426
|
if (onRenderClientError) {
|
|
427
427
|
await onError(onRenderClientError);
|
|
428
428
|
if (!isErrorPage)
|
|
@@ -474,6 +474,10 @@ async function renderPageClient(renderArgs) {
|
|
|
474
474
|
}
|
|
475
475
|
// Page scrolling
|
|
476
476
|
setScrollPosition(scrollTarget, urlOriginal);
|
|
477
|
+
if (isScrollPosition(scrollTarget)) {
|
|
478
|
+
// Restore window.history.state.vike.scrollPosition (in case scrolling occurred during rendering)
|
|
479
|
+
saveScrollPosition(scrollTarget);
|
|
480
|
+
}
|
|
477
481
|
scrollRestoration_initialRenderIsDone();
|
|
478
482
|
if (pageContext._hasPageContextFromServer)
|
|
479
483
|
setPageContextInitIsPassedToClient(pageContext);
|
|
@@ -482,6 +486,7 @@ async function renderPageClient(renderArgs) {
|
|
|
482
486
|
addLinkPrefetchHandlers();
|
|
483
487
|
globalObject.renderedPageContext = pageContext;
|
|
484
488
|
stampFinished(urlOriginal);
|
|
489
|
+
globalObject.hydrationAwaitPromiseResolve();
|
|
485
490
|
return pageContext;
|
|
486
491
|
}
|
|
487
492
|
}
|
|
@@ -549,6 +554,7 @@ function getIsRenderOutdated() {
|
|
|
549
554
|
let hydrationCanBeAborted = false;
|
|
550
555
|
const setHydrationCanBeAborted = () => {
|
|
551
556
|
hydrationCanBeAborted = true;
|
|
557
|
+
globalObject.hydrationAwaitPromiseResolve();
|
|
552
558
|
};
|
|
553
559
|
/** Whether the rendering should be aborted because a new rendering has started. We should call this after each `await`. */
|
|
554
560
|
const isRenderOutdated = (isRenderCleanup) => {
|
|
@@ -8,7 +8,7 @@ export { scrollRestoration_initialRenderIsDone };
|
|
|
8
8
|
// See also: https://github.com/cyco130/knave/blob/e9e1bc7687848504293197f1b314b7d12ad0d228/design.md#scroll-restoration
|
|
9
9
|
import { getGlobalObject } from '../../utils/getGlobalObject.js';
|
|
10
10
|
import { onPageHide, onPageShow } from '../../utils/onPageVisibilityChange.js';
|
|
11
|
-
const globalObject = getGlobalObject('
|
|
11
|
+
const globalObject = getGlobalObject('scrollRestoration.ts', {});
|
|
12
12
|
function scrollRestoration_init() {
|
|
13
13
|
// Use the native scroll restoration mechanism only for the first render
|
|
14
14
|
scrollRestoration_enable();
|
|
@@ -2,11 +2,14 @@ import '../assertEnvClient.js';
|
|
|
2
2
|
export { setScrollPosition };
|
|
3
3
|
export { autoSaveScrollPosition };
|
|
4
4
|
export { scrollToHashOrTop };
|
|
5
|
+
export { isScrollPosition };
|
|
5
6
|
export type { ScrollTarget };
|
|
6
7
|
import { type ScrollPosition } from './history.js';
|
|
7
8
|
type ScrollTarget = undefined | {
|
|
8
9
|
preserveScroll: boolean;
|
|
10
|
+
y?: undefined;
|
|
9
11
|
} | ScrollPosition;
|
|
10
12
|
declare function setScrollPosition(scrollTarget: ScrollTarget, url?: string): void;
|
|
11
13
|
declare function scrollToHashOrTop(hash: null | string): void;
|
|
14
|
+
declare function isScrollPosition(scrollTarget: ScrollTarget | undefined): scrollTarget is ScrollPosition;
|
|
12
15
|
declare function autoSaveScrollPosition(): void;
|
|
@@ -2,6 +2,7 @@ import '../assertEnvClient.js';
|
|
|
2
2
|
export { setScrollPosition };
|
|
3
3
|
export { autoSaveScrollPosition };
|
|
4
4
|
export { scrollToHashOrTop };
|
|
5
|
+
export { isScrollPosition };
|
|
5
6
|
import { assert } from '../../utils/assert.js';
|
|
6
7
|
import { onPageHide } from '../../utils/onPageVisibilityChange.js';
|
|
7
8
|
import { sleep } from '../../utils/sleep.js';
|
|
@@ -12,7 +13,7 @@ function setScrollPosition(scrollTarget, url) {
|
|
|
12
13
|
scrollToTextFragment(url);
|
|
13
14
|
return;
|
|
14
15
|
}
|
|
15
|
-
if (scrollTarget
|
|
16
|
+
if (isScrollPosition(scrollTarget)) {
|
|
16
17
|
setScroll(scrollTarget);
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
@@ -58,6 +59,9 @@ function scrollToHashOrTop(hash) {
|
|
|
58
59
|
function scrollToTop() {
|
|
59
60
|
setScroll({ x: 0, y: 0 });
|
|
60
61
|
}
|
|
62
|
+
function isScrollPosition(scrollTarget) {
|
|
63
|
+
return scrollTarget?.y !== undefined;
|
|
64
|
+
}
|
|
61
65
|
/**
|
|
62
66
|
* Change the browser's scroll position, in a way that works during a repaint.
|
|
63
67
|
*
|
|
@@ -118,6 +122,6 @@ function getUrlHash() {
|
|
|
118
122
|
// Save scroll position (needed for back-/forward navigation)
|
|
119
123
|
function autoSaveScrollPosition() {
|
|
120
124
|
// Safari cannot handle more than 100 `history.replaceState()` calls within 30 seconds (https://github.com/vikejs/vike/issues/46)
|
|
121
|
-
window.addEventListener('scroll', throttle(saveScrollPosition,
|
|
125
|
+
window.addEventListener('scroll', throttle(saveScrollPosition, 300), { passive: true });
|
|
122
126
|
onPageHide(saveScrollPosition);
|
|
123
127
|
}
|
|
@@ -127,7 +127,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
|
|
|
127
127
|
viteConfig: ResolvedConfig | undefined;
|
|
128
128
|
isClientSide: false;
|
|
129
129
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
130
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
130
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
131
131
|
} | {
|
|
132
132
|
_isPrerendering: true;
|
|
133
133
|
viteConfig: ResolvedConfig;
|
|
@@ -137,7 +137,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
|
|
|
137
137
|
_usesClientRouter: boolean;
|
|
138
138
|
isClientSide: false;
|
|
139
139
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
140
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
140
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
141
141
|
} | {
|
|
142
142
|
_isPrerendering: false;
|
|
143
143
|
viteConfig: null;
|
|
@@ -147,7 +147,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
|
|
|
147
147
|
_usesClientRouter: boolean;
|
|
148
148
|
isClientSide: false;
|
|
149
149
|
_pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
|
|
150
|
-
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").
|
|
150
|
+
_onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
|
|
151
151
|
}) & {
|
|
152
152
|
baseServer: string;
|
|
153
153
|
baseAssets: string;
|
|
@@ -167,7 +167,9 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
|
|
|
167
167
|
_pageFilesAll: PageFile[];
|
|
168
168
|
_baseServer: string;
|
|
169
169
|
_baseAssets: string;
|
|
170
|
-
_pageContextInit: import("../../types/PageContext.js").PageContextInit
|
|
170
|
+
_pageContextInit: import("../../types/PageContext.js").PageContextInit & {
|
|
171
|
+
headers?: Record<string, unknown>;
|
|
172
|
+
};
|
|
171
173
|
_urlHandler: ((url: string) => string) | null;
|
|
172
174
|
isClientSideNavigation: boolean;
|
|
173
175
|
} & {
|
|
@@ -5,35 +5,37 @@ import { escapeRegex } from '../../../utils/escapeRegex.js';
|
|
|
5
5
|
import { isNotNullish } from '../../../utils/isNullish.js';
|
|
6
6
|
import { assert, assertUsage, assertWarning } from '../../../utils/assert.js';
|
|
7
7
|
import { isArray } from '../../../utils/isArray.js';
|
|
8
|
-
import {
|
|
8
|
+
import { makeLast } from '../../../utils/sorter.js';
|
|
9
9
|
import { assertPosixPath } from '../../../utils/path.js';
|
|
10
10
|
import { getFilePathToShowToUserModule } from '../shared/getFilePath.js';
|
|
11
11
|
import { normalizeId } from '../shared/normalizeId.js';
|
|
12
12
|
import { isViteServerSide_extraSafe } from '../shared/isViteServerSide.js';
|
|
13
13
|
import { getMagicString } from '../shared/getMagicString.js';
|
|
14
|
+
import pc from '@brillout/picocolors';
|
|
14
15
|
const PUBLIC_ENV_PREFIX = 'PUBLIC_ENV__';
|
|
15
16
|
const PUBLIC_ENV_ALLOWLIST = [
|
|
16
17
|
// https://github.com/vikejs/vike/issues/1724
|
|
17
18
|
'STORYBOOK',
|
|
19
|
+
// https://github.com/vikejs/vike/pull/3069
|
|
20
|
+
'DEBUG',
|
|
18
21
|
];
|
|
19
22
|
// TO-DO/eventually:
|
|
20
23
|
// - Make import.meta.env work inside +config.js
|
|
21
24
|
// - For it to work, we'll probably need the user to define the settings (e.g. `envDir`) for loadEnv() inside vike.config.js instead of vite.config.js
|
|
22
25
|
// - Or stop using Vite's `mode` implementation and have Vike implement its own `mode` feature? (So that the only dependencies are `$ vike build --mode staging` and `$ MODE=staging vike build`.)
|
|
23
26
|
// === Rolldown filter
|
|
24
|
-
const
|
|
25
|
-
const skipIrrelevant = 'import.meta.env.';
|
|
27
|
+
const skipIrrelevant = 'import.meta.env';
|
|
26
28
|
const filterRolldown = {
|
|
29
|
+
/* We don't do that, because vike-react-sentry uses import.meta.env.PUBLIC_ENV__SENTRY_DSN
|
|
27
30
|
id: {
|
|
28
|
-
|
|
31
|
+
exclude: `**${'/node_modules/'}**`,
|
|
29
32
|
},
|
|
33
|
+
*/
|
|
30
34
|
code: {
|
|
31
35
|
include: skipIrrelevant,
|
|
32
36
|
},
|
|
33
37
|
};
|
|
34
|
-
const filterFunction = (
|
|
35
|
-
if (id.includes(skipNodeModules))
|
|
36
|
-
return false;
|
|
38
|
+
const filterFunction = (code) => {
|
|
37
39
|
if (!code.includes(skipIrrelevant))
|
|
38
40
|
return false;
|
|
39
41
|
return true;
|
|
@@ -46,6 +48,11 @@ function pluginReplaceConstantsEnvVars() {
|
|
|
46
48
|
return [
|
|
47
49
|
{
|
|
48
50
|
name: 'vike:pluginReplaceConstantsEnvVars',
|
|
51
|
+
// Correct order:
|
|
52
|
+
// 1. @vitejs/plugin-vue
|
|
53
|
+
// 2. vike:pluginExtractAssets and vike:pluginExtractExportNames [needs to be applied after @vitejs/plugin-vue]
|
|
54
|
+
// 3. vike:pluginReplaceConstantsEnvVars [needs to be applied after vike:pluginExtractAssets and vike:pluginExtractExportNames]
|
|
55
|
+
// 4. vite:define (Vite built-in plugin) [needs to be applied after vike:pluginReplaceConstantsEnvVars]
|
|
49
56
|
enforce: 'post',
|
|
50
57
|
configResolved: {
|
|
51
58
|
handler(config_) {
|
|
@@ -54,7 +61,7 @@ function pluginReplaceConstantsEnvVars() {
|
|
|
54
61
|
// Add process.env values defined by .env files
|
|
55
62
|
Object.entries(envVarsAll).forEach(([key, val]) => { var _a; return ((_a = process.env)[key] ?? (_a[key] = val)); });
|
|
56
63
|
envPrefix = getEnvPrefix(config);
|
|
57
|
-
config.plugins.sort(
|
|
64
|
+
config.plugins.sort(makeLast((plugin) => plugin.name === 'vite:define'));
|
|
58
65
|
},
|
|
59
66
|
},
|
|
60
67
|
transform: {
|
|
@@ -62,10 +69,7 @@ function pluginReplaceConstantsEnvVars() {
|
|
|
62
69
|
handler(code, id, options) {
|
|
63
70
|
id = normalizeId(id);
|
|
64
71
|
assertPosixPath(id);
|
|
65
|
-
|
|
66
|
-
if (!id.startsWith(config.root))
|
|
67
|
-
return; // skip linked dependencies
|
|
68
|
-
assert(filterFunction(id, code));
|
|
72
|
+
assert(filterFunction(code));
|
|
69
73
|
const isBuild = config.command === 'build';
|
|
70
74
|
const isClientSide = !isViteServerSide_extraSafe(config, this.environment, options);
|
|
71
75
|
const { magicString, getMagicStringResult } = getMagicString(code, id);
|
|
@@ -99,6 +103,17 @@ function pluginReplaceConstantsEnvVars() {
|
|
|
99
103
|
replacements.forEach(({ regExpStr, replacement }) => {
|
|
100
104
|
magicString.replaceAll(new RegExp(regExpStr, 'g'), JSON.stringify(replacement));
|
|
101
105
|
});
|
|
106
|
+
// Replace bare `import.meta.env` expression with `null` in the user-land.
|
|
107
|
+
// - Otherwise Vite replaces it with an object missing PUBLIC_ENV__ variables which is confusing for users.
|
|
108
|
+
// - We purposely don't support replacing `import.meta.env` with an object to incentivize users to write tree-shaking friendly code.
|
|
109
|
+
// - `define: { 'import.meta.env': JSON.stringify(null) }` doesn't work because it also replaces `import.meta.env` inside `import.meta.env.SONE_ENV`
|
|
110
|
+
const bareImportMetaEnvRegex = /\bimport\.meta\.env(?!\.)/g;
|
|
111
|
+
const isUserLand = !id.includes('node_modules') && id.startsWith(config.root); // skip node_modules/ as well as linked dependencies
|
|
112
|
+
if (isUserLand && bareImportMetaEnvRegex.test(code)) {
|
|
113
|
+
assertWarning(false, `The bare ${pc.cyan('import.meta.env')} expression in ${getFilePathToShowToUserModule(id, config)} is replaced with ${pc.cyan('null')} — use ${pc.cyan('import.meta.env.SONE_ENV')} instead ${pc.underline('https://vike.dev/env')}`, { onlyOnce: true });
|
|
114
|
+
bareImportMetaEnvRegex.lastIndex = 0; // Reset state after .test() since the /g flag makes the RegExp stateful
|
|
115
|
+
magicString.replaceAll(bareImportMetaEnvRegex, JSON.stringify(null));
|
|
116
|
+
}
|
|
102
117
|
return getMagicStringResult();
|
|
103
118
|
},
|
|
104
119
|
},
|
|
@@ -9,6 +9,8 @@ declare global {
|
|
|
9
9
|
/** Like `import.meta.env.SSR` but works for `node_modules/` packages with `ssr.external` */
|
|
10
10
|
var __VIKE__IS_CLIENT: boolean;
|
|
11
11
|
var __VIKE__IS_DEBUG: boolean;
|
|
12
|
+
/** Whether the code is processed by Vite, e.g. `true` when server code is `ssr.noExternal` */
|
|
13
|
+
var __VIKE__NO_EXTERNAL: true | undefined;
|
|
12
14
|
}
|
|
13
15
|
declare const VIRTUAL_FILE_ID_constantsGlobalThis = "virtual:vike:server:constantsGlobalThis";
|
|
14
16
|
declare function pluginReplaceConstantsGlobalThis(): Plugin[];
|