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.
Files changed (47) hide show
  1. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +1 -1
  2. package/dist/client/runtime-client-routing/entry.js +0 -4
  3. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +1 -1
  4. package/dist/client/runtime-client-routing/getPageContextCurrent.js +1 -1
  5. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +12 -4
  6. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +1 -1
  7. package/dist/client/runtime-client-routing/history.d.ts +1 -1
  8. package/dist/client/runtime-client-routing/history.js +2 -2
  9. package/dist/client/runtime-client-routing/initClientRouter.d.ts +1 -1
  10. package/dist/client/runtime-client-routing/initClientRouter.js +13 -6
  11. package/dist/client/runtime-client-routing/navigate.js +4 -3
  12. package/dist/client/runtime-client-routing/prefetch.js +1 -1
  13. package/dist/client/runtime-client-routing/renderPageClient.d.ts +4 -6
  14. package/dist/client/runtime-client-routing/renderPageClient.js +25 -19
  15. package/dist/client/runtime-client-routing/scrollRestoration.js +1 -1
  16. package/dist/client/runtime-client-routing/setScrollPosition.d.ts +3 -0
  17. package/dist/client/runtime-client-routing/setScrollPosition.js +6 -2
  18. package/dist/node/prerender/runPrerender.d.ts +6 -4
  19. package/dist/node/vite/plugins/pluginReplaceConstantsEnvVars.js +27 -12
  20. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.d.ts +2 -0
  21. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +1 -0
  22. package/dist/node/vite/shared/loggerVite.js +11 -4
  23. package/dist/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +7 -3
  24. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +7 -2
  25. package/dist/server/runtime/globalContext.d.ts +10 -10
  26. package/dist/server/runtime/renderPageServer/addErrorHint.js +2 -1
  27. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +9 -5
  28. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +2 -2
  29. package/dist/server/runtime/renderPageServer/handlePageContextRequestUrl.js +5 -5
  30. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +6 -4
  31. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +24 -16
  32. package/dist/server/runtime/renderPageServer.d.ts +6 -4
  33. package/dist/shared-server-client/assertVirtualFileExports.js +3 -3
  34. package/dist/shared-server-client/createGlobalContextShared.d.ts +2 -2
  35. package/dist/shared-server-client/hooks/execHook.d.ts +13 -7
  36. package/dist/shared-server-client/hooks/execHook.js +1 -0
  37. package/dist/shared-server-client/hooks/getHook.d.ts +7 -7
  38. package/dist/shared-server-client/route/abort.js +1 -4
  39. package/dist/shared-server-client/route/loadPageRoutes.d.ts +3 -3
  40. package/dist/types/Config.d.ts +2 -5
  41. package/dist/types/PageContext.d.ts +2 -1
  42. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  43. package/dist/utils/PROJECT_VERSION.js +1 -1
  44. package/dist/utils/debug.js +8 -12
  45. package/dist/utils/isBrowser.d.ts +1 -0
  46. package/dist/utils/isBrowser.js +5 -3
  47. 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").Hook | null;
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").Hook | null;
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('runtime-client-routing/getPageContextCurrent.ts', {
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").Hook | null;
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").Hook | null;
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").Hook | null;
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").Hook | null;
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('runtime-client-routing/getPageContextFromHooks.ts', {});
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
- const scrollPosition = getScrollPosition();
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,3 +1,3 @@
1
1
  import '../assertEnvClient.js';
2
2
  export { initClientRouter };
3
- declare function initClientRouter(): Promise<void>;
3
+ declare function initClientRouter(): void;
@@ -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
- async function initClientRouter() {
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
- const renderFirstPagePromise = renderFirstPage();
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
- async function renderFirstPage() {
30
+ function renderFirstPage() {
24
31
  assert(getRenderCount() === 0);
25
- await renderPageClient({
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 { firstRenderStartPromise, renderPageClient } from './renderPageClient.js';
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
- // If `hydrationCanBeAborted === false` (e.g. Vue) then we can apply navigate() only after hydration is done
23
- await firstRenderStartPromise;
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('runtime-client-routing/prefetch.ts', {
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").Hook | null;
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").Hook | null;
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").Hook | null;
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").Hook | null;
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('runtime-client-routing/renderPageClient.ts', (() => {
38
- const { promise: firstRenderStartPromise, resolve: firstRenderStartPromiseResolve } = genPromise();
36
+ const globalObject = getGlobalObject('renderPageClient.ts', (() => {
37
+ const { promise: hydrationAwaitPromise, resolve: hydrationAwaitPromiseResolve } = genPromise();
39
38
  return {
40
39
  renderCounter: 0,
41
- firstRenderStartPromise,
42
- firstRenderStartPromiseResolve,
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
- globalObject.firstRenderStartPromiseResolve();
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
- assertWarning(!isReact(), 'You seem to be using React; we recommend setting hydrationCanBeAborted to true, see https://vike.dev/hydrationCanBeAborted', { onlyOnce: true });
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('runtime-client-routing/scrollRestoration.ts', {});
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 && 'x' in 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, Math.ceil(1000 / 3)), { passive: true });
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").Hook | null;
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").Hook | null;
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").Hook | null;
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 { lowerFirst } from '../../../utils/sorter.js';
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 skipNodeModules = '/node_modules/';
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
- exclude: `**${skipNodeModules}**`,
31
+ exclude: `**${'/node_modules/'}**`,
29
32
  },
33
+ */
30
34
  code: {
31
35
  include: skipIrrelevant,
32
36
  },
33
37
  };
34
- const filterFunction = (id, code) => {
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(lowerFirst((plugin) => (plugin.name === 'vite:define' ? 1 : 0)));
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
- assertPosixPath(config.root);
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[];
@@ -33,6 +33,7 @@ function pluginReplaceConstantsGlobalThis() {
33
33
  define: {
34
34
  'globalThis.__VIKE__IS_DEV': JSON.stringify(isDev),
35
35
  'globalThis.__VIKE__IS_DEBUG': JSON.stringify(isDebugVal),
36
+ 'globalThis.__VIKE__NO_EXTERNAL': 'true',
36
37
  },
37
38
  };
38
39
  },