vike 0.4.229-commit-58f7ed0 → 0.4.229-commit-7056ef0

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 (76) hide show
  1. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +4 -0
  2. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +12 -6
  3. package/dist/cjs/node/prerender/runPrerender.js +2 -2
  4. package/dist/cjs/node/runtime/renderPage/createHttpResponse/getCacheControl.js +7 -5
  5. package/dist/cjs/node/runtime/renderPage/createHttpResponse.js +0 -1
  6. package/dist/cjs/node/runtime/renderPage/createPageContextServerSide.js +2 -1
  7. package/dist/cjs/node/runtime/renderPage/executeHookServer.js +11 -0
  8. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +11 -12
  9. package/dist/cjs/node/runtime/renderPage/{loadUserFilesServerSide.js → loadPageConfigsLazyServerSide.js} +4 -4
  10. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +2 -2
  11. package/dist/cjs/node/runtime/renderPage.js +2 -2
  12. package/dist/cjs/shared/createGlobalContextShared.js +33 -7
  13. package/dist/cjs/shared/createPageContextShared.js +5 -11
  14. package/dist/cjs/shared/hooks/executeHook.js +21 -0
  15. package/dist/cjs/shared/hooks/getHook.js +23 -4
  16. package/dist/cjs/shared/page-configs/{getPageConfigUserFriendly.js → getUserFriendlyConfigs.js} +37 -32
  17. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  18. package/dist/esm/client/client-routing-runtime/{createPageContext.d.ts → createPageContextClientSide.d.ts} +11 -6
  19. package/dist/esm/client/client-routing-runtime/{createPageContext.js → createPageContextClientSide.js} +1 -1
  20. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +15 -7
  21. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +44 -42
  22. package/dist/esm/client/client-routing-runtime/globalContext.d.ts +10 -1
  23. package/dist/esm/client/client-routing-runtime/prefetch.js +3 -3
  24. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +16 -9
  25. package/dist/esm/client/server-routing-runtime/createPageContextClientSide.d.ts +11 -7
  26. package/dist/esm/client/server-routing-runtime/createPageContextClientSide.js +4 -5
  27. package/dist/esm/client/server-routing-runtime/entry.js +5 -3
  28. package/dist/esm/client/server-routing-runtime/globalContext.d.ts +10 -1
  29. package/dist/esm/client/shared/createGetGlobalContextClient.d.ts +10 -1
  30. package/dist/esm/client/shared/{loadUserFilesClientSide.d.ts → loadPageConfigsLazyClientSide.d.ts} +2 -2
  31. package/dist/esm/client/shared/{loadUserFilesClientSide.js → loadPageConfigsLazyClientSide.js} +4 -4
  32. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +4 -0
  33. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +1 -1
  34. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +12 -6
  35. package/dist/esm/node/prerender/runPrerender.d.ts +82 -18
  36. package/dist/esm/node/prerender/runPrerender.js +2 -2
  37. package/dist/esm/node/runtime/globalContext.d.ts +181 -18
  38. package/dist/esm/node/runtime/renderPage/createHttpResponse/getCacheControl.d.ts +1 -1
  39. package/dist/esm/node/runtime/renderPage/createHttpResponse/getCacheControl.js +7 -5
  40. package/dist/esm/node/runtime/renderPage/createHttpResponse.js +0 -1
  41. package/dist/esm/node/runtime/renderPage/createPageContextServerSide.d.ts +41 -9
  42. package/dist/esm/node/runtime/renderPage/createPageContextServerSide.js +2 -1
  43. package/dist/esm/node/runtime/renderPage/executeHookServer.d.ts +13 -0
  44. package/dist/esm/node/runtime/renderPage/executeHookServer.js +9 -0
  45. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +2 -3
  46. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +11 -12
  47. package/dist/esm/node/runtime/renderPage/{loadUserFilesServerSide.d.ts → loadPageConfigsLazyServerSide.d.ts} +6 -6
  48. package/dist/esm/node/runtime/renderPage/{loadUserFilesServerSide.js → loadPageConfigsLazyServerSide.js} +4 -4
  49. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +1 -1
  50. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +84 -20
  51. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +2 -2
  52. package/dist/esm/node/runtime/renderPage.d.ts +41 -9
  53. package/dist/esm/node/runtime/renderPage.js +2 -2
  54. package/dist/esm/shared/createGlobalContextShared.d.ts +26 -6
  55. package/dist/esm/shared/createGlobalContextShared.js +33 -7
  56. package/dist/esm/shared/createPageContextShared.d.ts +3 -6
  57. package/dist/esm/shared/createPageContextShared.js +5 -11
  58. package/dist/esm/shared/getPageFiles.d.ts +1 -1
  59. package/dist/esm/shared/hooks/executeHook.d.ts +14 -1
  60. package/dist/esm/shared/hooks/executeHook.js +21 -0
  61. package/dist/esm/shared/hooks/getHook.d.ts +7 -10
  62. package/dist/esm/shared/hooks/getHook.js +23 -4
  63. package/dist/esm/shared/page-configs/Config.d.ts +10 -3
  64. package/dist/esm/shared/page-configs/{getPageConfigUserFriendly.d.ts → getUserFriendlyConfigs.d.ts} +8 -6
  65. package/dist/esm/shared/page-configs/{getPageConfigUserFriendly.js → getUserFriendlyConfigs.js} +37 -32
  66. package/dist/esm/shared/types.d.ts +1 -1
  67. package/dist/esm/types/index.d.ts +1 -1
  68. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  69. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  70. package/package.json +1 -1
  71. package/dist/cjs/shared/getPageConfigsRuntime.js +0 -23
  72. package/dist/cjs/shared/hooks/executeHookGeneric.js +0 -18
  73. package/dist/esm/shared/getPageConfigsRuntime.d.ts +0 -14
  74. package/dist/esm/shared/getPageConfigsRuntime.js +0 -21
  75. package/dist/esm/shared/hooks/executeHookGeneric.d.ts +0 -8
  76. package/dist/esm/shared/hooks/executeHookGeneric.js +0 -16
@@ -3,10 +3,12 @@ export { getPageContextFromHooks_serialized };
3
3
  export { getPageContextFromServerHooks };
4
4
  export { getPageContextFromClientHooks };
5
5
  export { setPageContextInitIsPassedToClient };
6
+ export { executeHookClient };
6
7
  export type { PageContextFromServerHooks };
7
- export type { PageContextFromClientHooks };
8
8
  import type { PageConfigUserFriendlyOld, PageFile } from '../../shared/getPageFiles.js';
9
+ import { type PageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
9
10
  import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
11
+ import type { HookName } from '../../shared/page-configs/Config.js';
10
12
  type PageContext = {
11
13
  urlOriginal: string;
12
14
  _urlRewrite: string | null;
@@ -25,8 +27,6 @@ declare function getPageContextFromHooks_isHydration(pageContext: PageContextSer
25
27
  _hasPageContextFromServer: true;
26
28
  }): Promise<PageContextSerialized & PageContext & PageConfigUserFriendlyOld & {
27
29
  _hasPageContextFromServer: true;
28
- } & {
29
- _hasPageContextFromClient: boolean;
30
30
  }>;
31
31
  type PageContextFromServerHooks = {
32
32
  _hasPageContextFromServer: boolean;
@@ -39,11 +39,19 @@ declare function getPageContextFromServerHooks(pageContext: {
39
39
  is404ServerSideRouted?: undefined;
40
40
  pageContextFromServerHooks: PageContextFromServerHooks;
41
41
  }>;
42
- type PageContextFromClientHooks = {
43
- _hasPageContextFromClient: boolean;
44
- };
45
42
  declare function getPageContextFromClientHooks(pageContext: {
46
43
  pageId: string;
47
44
  _hasPageContextFromServer: boolean;
48
- } & PageContext & PageConfigUserFriendlyOld, isErrorPage: boolean): Promise<PageContextFromClientHooks>;
45
+ } & PageContext & PageConfigUserFriendlyOld, isErrorPage: boolean): Promise<{
46
+ pageId: string;
47
+ _hasPageContextFromServer: boolean;
48
+ } & PageContext & PageConfigUserFriendlyOld>;
49
+ type PageContextExecuteHookClient = PageConfigUserFriendlyOld & PageContextForUserConsumptionClientSide;
50
+ declare function executeHookClient(hookName: HookName, pageContext: PageContextExecuteHookClient): Promise<{
51
+ hookResult: unknown;
52
+ hookName: import("../../shared/page-configs/Config.js").HookNameOld;
53
+ hookFilePath: string;
54
+ hookFn: (arg: object) => unknown;
55
+ hookTimeout: import("../../shared/hooks/getHook.js").HookTimeout;
56
+ }[]>;
49
57
  declare function setPageContextInitIsPassedToClient(pageContext: Record<string, unknown>): void;
@@ -3,11 +3,11 @@ export { getPageContextFromHooks_serialized };
3
3
  export { getPageContextFromServerHooks };
4
4
  export { getPageContextFromClientHooks };
5
5
  export { setPageContextInitIsPassedToClient };
6
+ export { executeHookClient };
6
7
  import { assert, assertUsage, hasProp, objectAssign, getProjectError, redirectHard, isObject, getGlobalObject } from './utils.js';
7
8
  import { parse } from '@brillout/json-serializer/parse';
8
9
  import { getPageContextSerializedInHtml } from '../shared/getJsonSerializedInHtml.js';
9
10
  import { analyzePageServerSide } from '../../shared/getPageFiles/analyzePageServerSide.js';
10
- import { getHookFromPageContext } from '../../shared/hooks/getHook.js';
11
11
  import { preparePageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
12
12
  import { removeBuiltInOverrides } from './getPageContext/removeBuiltInOverrides.js';
13
13
  import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
@@ -18,9 +18,9 @@ import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
18
18
  import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
19
19
  import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
20
20
  import { isServerSideError } from '../../shared/misc/isServerSideError.js';
21
- import { executeHook } from '../../shared/hooks/executeHook.js';
21
+ import { executeHookNew } from '../../shared/hooks/executeHook.js';
22
22
  const globalObject = getGlobalObject('client-routing-runtime/getPageContextFromHooks.ts', {});
23
- // TODO/eventually: rename
23
+ // TO-DO/eventually: rename
24
24
  function getPageContextFromHooks_serialized() {
25
25
  const pageContextSerialized = getPageContextSerializedInHtml();
26
26
  assertUsage(!('urlOriginal' in pageContextSerialized), "Adding 'urlOriginal' to passToClient is forbidden");
@@ -32,14 +32,9 @@ function getPageContextFromHooks_serialized() {
32
32
  }
33
33
  // TO-DO/eventually: rename
34
34
  async function getPageContextFromHooks_isHydration(pageContext) {
35
- objectAssign(pageContext, {
36
- _hasPageContextFromClient: false
37
- });
38
35
  for (const hookName of ['data', 'onBeforeRender']) {
39
36
  if (hookClientOnlyExists(hookName, pageContext)) {
40
- const pageContextFromHook = await executeHookClientSide(hookName, pageContext);
41
- assert(!('urlOriginal' in pageContextFromHook));
42
- Object.assign(pageContext, pageContextFromHook);
37
+ await executeDataLikeHook(hookName, pageContext);
43
38
  }
44
39
  }
45
40
  return pageContext;
@@ -70,9 +65,7 @@ async function getPageContextFromServerHooks(pageContext, isErrorPage) {
70
65
  return { pageContextFromServerHooks };
71
66
  }
72
67
  async function getPageContextFromClientHooks(pageContext, isErrorPage) {
73
- objectAssign(pageContext, {
74
- _hasPageContextFromClient: false
75
- });
68
+ let dataHookExists = false;
76
69
  // At this point, we need to call the client-side guard(), data() and onBeforeRender() hooks, if they exist on client
77
70
  // env. However if we have fetched pageContext from the server, some of them might have run already on the
78
71
  // server-side, so we run only the client-only ones in this case.
@@ -89,46 +82,55 @@ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
89
82
  }
90
83
  }
91
84
  else {
92
- assert(hookName === 'data' || hookName === 'onBeforeRender');
85
+ if (hookName === 'data')
86
+ dataHookExists = true;
93
87
  if (hookClientOnlyExists(hookName, pageContext) || !pageContext._hasPageContextFromServer) {
94
88
  // This won't do anything if no hook has been defined or if the hook's env.client is false.
95
- const pageContextFromHook = await executeHookClientSide(hookName, pageContext);
96
- assert(!('urlOriginal' in pageContextFromHook));
97
- Object.assign(pageContext, pageContextFromHook);
89
+ await executeDataLikeHook(hookName, pageContext);
98
90
  }
99
91
  }
100
92
  }
93
+ // Execute +onData
94
+ if (dataHookExists) {
95
+ await executeHookClient('onData', pageContext);
96
+ }
101
97
  const pageContextFromClientHooks = pageContext;
102
98
  return pageContextFromClientHooks;
103
99
  }
104
- async function executeHookClientSide(hookName, pageContext) {
105
- const hook = getHookFromPageContext(pageContext, hookName);
106
- if (!hook) {
107
- // No hook defined or hook's env.client is false
108
- return {};
109
- }
110
- const pageContextForUserConsumption = preparePageContextForUserConsumptionClientSide(pageContext, true);
111
- const hookResult = await executeHook(() => hook.hookFn(pageContextForUserConsumption), hook, pageContext);
112
- const pageContextFromHook = {};
113
- if (hookName === 'onBeforeRender') {
114
- assertOnBeforeRenderHookReturn(hookResult, hook.hookFilePath);
115
- // Note: hookResult looks like { pageContext: { ... } }
116
- const pageContextFromOnBeforeRender = hookResult?.pageContext;
117
- if (pageContextFromOnBeforeRender) {
118
- objectAssign(pageContextFromHook, { _hasPageContextFromClient: true });
119
- objectAssign(pageContextFromHook, pageContextFromOnBeforeRender);
120
- }
100
+ async function executeHookClient(hookName, pageContext) {
101
+ return await executeHookNew(hookName, pageContext, (p) => preparePageContextForUserConsumptionClientSide(p, true));
102
+ }
103
+ async function executeDataLikeHook(hookName, pageContext) {
104
+ let pageContextFromHook;
105
+ if (hookName === 'data') {
106
+ pageContextFromHook = await executeDataHook(pageContext);
121
107
  }
122
108
  else {
123
- assert(hookName === 'data');
124
- // Note: hookResult can be anything (e.g. an object) and is to be assigned to pageContext.data
125
- const pageContextFromData = {
126
- data: hookResult
127
- };
128
- if (hookResult) {
129
- objectAssign(pageContextFromHook, { _hasPageContextFromClient: true });
130
- }
131
- objectAssign(pageContextFromHook, pageContextFromData);
109
+ pageContextFromHook = await executeOnBeforeRenderHook(pageContext);
110
+ }
111
+ Object.assign(pageContext, pageContextFromHook);
112
+ }
113
+ async function executeDataHook(pageContext) {
114
+ const res = await executeHookClient('data', pageContext);
115
+ const hook = res[0]; // TO-DO/soon: support cumulative
116
+ if (!hook)
117
+ return;
118
+ const { hookResult } = hook;
119
+ const pageContextAddendum = { data: hookResult };
120
+ return pageContextAddendum;
121
+ }
122
+ async function executeOnBeforeRenderHook(pageContext) {
123
+ const res = await executeHookClient('onBeforeRender', pageContext);
124
+ const hook = res[0]; // TO-DO/soon: support cumulative
125
+ if (!hook)
126
+ return;
127
+ const { hookResult, hookFilePath } = hook;
128
+ const pageContextFromHook = {};
129
+ assertOnBeforeRenderHookReturn(hookResult, hookFilePath);
130
+ // Note: hookResult looks like { pageContext: { ... } }
131
+ const pageContextFromOnBeforeRender = hookResult?.pageContext;
132
+ if (pageContextFromOnBeforeRender) {
133
+ objectAssign(pageContextFromHook, pageContextFromOnBeforeRender);
132
134
  }
133
135
  return pageContextFromHook;
134
136
  }
@@ -10,8 +10,17 @@ declare const getGlobalContextClientInternal: () => Promise<{
10
10
  _pageConfigs: import("../../__internal/index.js").PageConfig[];
11
11
  _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
12
12
  _allPageIds: string[];
13
+ _userFriendlyConfigsGlobal: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly;
13
14
  config: import("../../types/index.js").ConfigResolved;
14
- pages: import("../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
15
+ pages: {
16
+ [k: string]: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & ({
17
+ route: import("../../shared/page-configs/Config.js").Route;
18
+ isErrorPage?: undefined;
19
+ } | {
20
+ route?: undefined;
21
+ isErrorPage: true;
22
+ });
23
+ };
15
24
  } & {
16
25
  isClientSide: true;
17
26
  } & {
@@ -6,11 +6,11 @@ export { addLinkPrefetchHandlers };
6
6
  export { addLinkPrefetchHandlers_watch };
7
7
  export { addLinkPrefetchHandlers_unwatch };
8
8
  import { assert, assertClientRouting, assertUsage, assertWarning, checkIfClientRouting, getGlobalObject, hasProp, objectAssign } from './utils.js';
9
- import { isErrorFetchingStaticAssets, loadUserFilesClientSide } from '../shared/loadUserFilesClientSide.js';
9
+ import { isErrorFetchingStaticAssets, loadPageConfigsLazyClientSide } from '../shared/loadPageConfigsLazyClientSide.js';
10
10
  import { skipLink } from './skipLink.js';
11
11
  import { disableClientRouting } from './renderPageClientSide.js';
12
12
  import { isClientSideRoutable } from './isClientSideRoutable.js';
13
- import { createPageContextClientSide } from './createPageContext.js';
13
+ import { createPageContextClientSide } from './createPageContextClientSide.js';
14
14
  import { route } from '../../shared/route/index.js';
15
15
  import { noRouteMatch } from '../../shared/route/noRouteMatch.js';
16
16
  import { getPageContextFromServerHooks } from './getPageContextFromHooks.js';
@@ -45,7 +45,7 @@ function getPageContextPrefetched(pageContext) {
45
45
  }
46
46
  async function prefetchAssets(pageContextLink) {
47
47
  try {
48
- await loadUserFilesClientSide(pageContextLink.pageId, pageContextLink._pageFilesAll, pageContextLink._pageConfigs, pageContextLink._pageConfigGlobal);
48
+ await loadPageConfigsLazyClientSide(pageContextLink.pageId, pageContextLink._pageFilesAll, pageContextLink._pageConfigs, pageContextLink._pageConfigGlobal);
49
49
  }
50
50
  catch (err) {
51
51
  if (isErrorFetchingStaticAssets(err)) {
@@ -4,13 +4,13 @@ export { disableClientRouting };
4
4
  export { firstRenderStartPromise };
5
5
  export { getPageContextClient };
6
6
  import { assert, isSameErrorMessage, objectAssign, redirectHard, getGlobalObject, hasProp, augmentType, genPromise, isCallable, catchInfiniteLoop } from './utils.js';
7
- import { getPageContextFromClientHooks, getPageContextFromServerHooks, getPageContextFromHooks_isHydration, getPageContextFromHooks_serialized, setPageContextInitIsPassedToClient } from './getPageContextFromHooks.js';
8
- import { createPageContextClientSide } from './createPageContext.js';
7
+ import { getPageContextFromClientHooks, getPageContextFromServerHooks, getPageContextFromHooks_isHydration, getPageContextFromHooks_serialized, setPageContextInitIsPassedToClient, executeHookClient } from './getPageContextFromHooks.js';
8
+ import { createPageContextClientSide } from './createPageContextClientSide.js';
9
9
  import { addLinkPrefetchHandlers, addLinkPrefetchHandlers_unwatch, addLinkPrefetchHandlers_watch, getPageContextPrefetched, populatePageContextPrefetchCache } from './prefetch.js';
10
10
  import { assertInfo, assertWarning, isReact } from './utils.js';
11
11
  import { executeOnRenderClientHook } from '../shared/executeOnRenderClientHook.js';
12
- import { assertHook, getHookFromPageContext } from '../../shared/hooks/getHook.js';
13
- import { isErrorFetchingStaticAssets, loadUserFilesClientSide } from '../shared/loadUserFilesClientSide.js';
12
+ import { getHookFromPageContext } from '../../shared/hooks/getHook.js';
13
+ import { isErrorFetchingStaticAssets, loadPageConfigsLazyClientSide } from '../shared/loadPageConfigsLazyClientSide.js';
14
14
  import { pushHistoryState } from './history.js';
15
15
  import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled } from '../../shared/route/abort.js';
16
16
  import { route } from '../../shared/route/index.js';
@@ -60,7 +60,6 @@ async function renderPageClientSide(renderArgs) {
60
60
  assert(previousPageContext);
61
61
  // We use the hook of the previous page in order to be able to call onPageTransitionStart() before fetching the files of the next page.
62
62
  // https://github.com/vikejs/vike/issues/1560
63
- assertHook(previousPageContext, 'onPageTransitionStart');
64
63
  if (!globalObject.isTransitioning) {
65
64
  globalObject.isTransitioning = true;
66
65
  const onPageTransitionStartHook = getHookFromPageContext(previousPageContext, 'onPageTransitionStart');
@@ -132,7 +131,7 @@ async function renderPageClientSide(renderArgs) {
132
131
  objectAssign(pageContext, pageContextFromRoute);
133
132
  }
134
133
  try {
135
- objectAssign(pageContext, await loadUserFilesClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
134
+ objectAssign(pageContext, await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
136
135
  }
137
136
  catch (err) {
138
137
  if (handleErrorFetchingStaticAssets(err, pageContext, isFirstRender)) {
@@ -200,6 +199,16 @@ async function renderPageClientSide(renderArgs) {
200
199
  // TO-DO/eventually: create helper assertPageContextFromHook()
201
200
  assert(!('urlOriginal' in pageContextFromServerHooks));
202
201
  objectAssign(pageContext, pageContextFromServerHooks);
202
+ // Execute +onData
203
+ try {
204
+ await executeHookClient('onData', pageContext);
205
+ }
206
+ catch (err) {
207
+ await onError(err);
208
+ return;
209
+ }
210
+ if (isRenderOutdated())
211
+ return;
203
212
  // Get pageContext from client-side hooks
204
213
  let pageContextFromClientHooks;
205
214
  try {
@@ -337,7 +346,7 @@ async function renderPageClientSide(renderArgs) {
337
346
  return;
338
347
  }
339
348
  try {
340
- objectAssign(pageContext, await loadUserFilesClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
349
+ objectAssign(pageContext, await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
341
350
  }
342
351
  catch (err) {
343
352
  if (handleErrorFetchingStaticAssets(err, pageContext, isFirstRender)) {
@@ -429,7 +438,6 @@ async function renderPageClientSide(renderArgs) {
429
438
  */
430
439
  // onHydrationEnd()
431
440
  if (isFirstRender && !onRenderClientError) {
432
- assertHook(pageContext, 'onHydrationEnd');
433
441
  const hook = getHookFromPageContext(pageContext, 'onHydrationEnd');
434
442
  if (hook) {
435
443
  const { hookFn } = hook;
@@ -452,7 +460,6 @@ async function renderPageClientSide(renderArgs) {
452
460
  if (globalObject.isTransitioning) {
453
461
  globalObject.isTransitioning = undefined;
454
462
  assert(previousPageContext);
455
- assertHook(previousPageContext, 'onPageTransitionEnd');
456
463
  const hook = getHookFromPageContext(previousPageContext, 'onPageTransitionEnd');
457
464
  if (hook) {
458
465
  const { hookFn } = hook;
@@ -7,8 +7,17 @@ declare function createPageContextClientSide(): Promise<{
7
7
  _pageConfigs: import("../../__internal/index.js").PageConfig[];
8
8
  _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
9
9
  _allPageIds: string[];
10
+ _userFriendlyConfigsGlobal: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly;
10
11
  config: import("../../types/index.js").ConfigResolved;
11
- pages: import("../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
12
+ pages: {
13
+ [k: string]: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & ({
14
+ route: import("../../shared/page-configs/Config.js").Route;
15
+ isErrorPage?: undefined;
16
+ } | {
17
+ route?: undefined;
18
+ isErrorPage: true;
19
+ });
20
+ };
12
21
  } & {
13
22
  isClientSide: true;
14
23
  } & object;
@@ -21,16 +30,11 @@ declare function createPageContextClientSide(): Promise<{
21
30
  isHydration: true;
22
31
  isBackwardNavigation: null;
23
32
  _hasPageContextFromServer: true;
24
- _hasPageContextFromClient: false;
25
33
  } & {
26
34
  pageId: string;
27
35
  routeParams: Record<string, string>;
28
36
  } & {
29
- config: import("../../types/index.js").ConfigResolved;
30
- _source: import("../../shared/page-configs/getPageConfigUserFriendly.js").Source;
31
- _sources: import("../../shared/page-configs/getPageConfigUserFriendly.js").Sources;
32
- _from: import("../../shared/page-configs/getPageConfigUserFriendly.js").From;
33
37
  isPageContext: true;
34
- } & import("../../shared/getPageFiles.js").PageConfigUserFriendlyOld & {
38
+ } & import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & import("../../shared/getPageFiles.js").PageConfigUserFriendlyOld & {
35
39
  _pageFilesLoaded: import("../../shared/getPageFiles.js").PageFile[];
36
40
  }>;
@@ -1,7 +1,7 @@
1
1
  export { createPageContextClientSide };
2
2
  import { assertUsage, augmentType, objectAssign } from './utils.js';
3
3
  import { getPageContextSerializedInHtml } from '../shared/getJsonSerializedInHtml.js';
4
- import { loadUserFilesClientSide } from '../shared/loadUserFilesClientSide.js';
4
+ import { loadPageConfigsLazyClientSide } from '../shared/loadPageConfigsLazyClientSide.js';
5
5
  import { getCurrentUrl } from '../shared/getCurrentUrl.js';
6
6
  import { createPageContextShared } from '../../shared/createPageContextShared.js';
7
7
  import { getGlobalContextClientInternal } from './globalContext.js';
@@ -21,15 +21,14 @@ async function createPageContextClientSide() {
21
21
  isClientSide: true,
22
22
  isHydration: true,
23
23
  isBackwardNavigation: null,
24
- _hasPageContextFromServer: true,
25
- _hasPageContextFromClient: false
24
+ _hasPageContextFromServer: true
26
25
  };
27
26
  objectAssign(pageContextCreated, getPageContextSerializedInHtml());
28
27
  // Sets pageContext.config to global configs
29
- const pageContextAugmented = await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal);
28
+ const pageContextAugmented = await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal, globalContext._userFriendlyConfigsGlobal);
30
29
  augmentType(pageContextCreated, pageContextAugmented);
31
30
  // Sets pageContext.config to local configs (overrides the pageContext.config set above)
32
- objectAssign(pageContextCreated, await loadUserFilesClientSide(pageContextCreated.pageId, pageContextCreated._pageFilesAll, pageContextCreated._pageConfigs, pageContextCreated._pageConfigGlobal));
31
+ objectAssign(pageContextCreated, await loadPageConfigsLazyClientSide(pageContextCreated.pageId, pageContextCreated._pageFilesAll, pageContextCreated._pageConfigs, pageContextCreated._pageConfigGlobal));
33
32
  assertPristineUrl();
34
33
  return pageContextCreated;
35
34
  }
@@ -2,9 +2,10 @@ import { assertServerRouting } from '../../utils/assertRoutingType.js';
2
2
  assertServerRouting();
3
3
  import { createPageContextClientSide } from './createPageContextClientSide.js';
4
4
  import { executeOnRenderClientHook } from '../shared/executeOnRenderClientHook.js';
5
- import { assertHook } from '../../shared/hooks/getHook.js';
5
+ import { getHookFromPageContext } from '../../shared/hooks/getHook.js';
6
6
  import { assertSingleInstance_onClientEntryServerRouting } from './utils.js';
7
7
  import { removeFoucBuster } from '../shared/removeFoucBuster.js';
8
+ import { executeHook } from '../../shared/hooks/executeHook.js';
8
9
  // @ts-ignore Since dist/cjs/client/ is never used, we can ignore this error.
9
10
  const isProd = import.meta.env.PROD;
10
11
  assertSingleInstance_onClientEntryServerRouting(isProd);
@@ -14,6 +15,7 @@ hydrate();
14
15
  async function hydrate() {
15
16
  const pageContext = await createPageContextClientSide();
16
17
  await executeOnRenderClientHook(pageContext, false);
17
- assertHook(pageContext, 'onHydrationEnd');
18
- await pageContext.exports.onHydrationEnd?.(pageContext);
18
+ const hook = getHookFromPageContext(pageContext, 'onHydrationEnd');
19
+ if (hook)
20
+ await executeHook(() => hook.hookFn(pageContext), hook, pageContext);
19
21
  }
@@ -10,8 +10,17 @@ declare const getGlobalContextClientInternal: () => Promise<{
10
10
  _pageConfigs: import("../../__internal/index.js").PageConfig[];
11
11
  _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
12
12
  _allPageIds: string[];
13
+ _userFriendlyConfigsGlobal: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly;
13
14
  config: import("../../types/index.js").ConfigResolved;
14
- pages: import("../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
15
+ pages: {
16
+ [k: string]: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & ({
17
+ route: import("../../shared/page-configs/Config.js").Route;
18
+ isErrorPage?: undefined;
19
+ } | {
20
+ route?: undefined;
21
+ isErrorPage: true;
22
+ });
23
+ };
15
24
  } & {
16
25
  isClientSide: true;
17
26
  } & object>;
@@ -9,8 +9,17 @@ declare function createGetGlobalContextClient<GlobalContextAddendum extends obje
9
9
  _pageConfigs: import("../../__internal/index.js").PageConfig[];
10
10
  _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
11
11
  _allPageIds: string[];
12
+ _userFriendlyConfigsGlobal: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly;
12
13
  config: import("../../types/index.js").ConfigResolved;
13
- pages: import("../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
14
+ pages: {
15
+ [k: string]: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & ({
16
+ route: import("../../shared/page-configs/Config.js").Route;
17
+ isErrorPage?: undefined;
18
+ } | {
19
+ route?: undefined;
20
+ isErrorPage: true;
21
+ });
22
+ };
14
23
  } & Awaited<{
15
24
  /**
16
25
  * Whether the environment is client-side or server-side / pre-rendering.
@@ -1,4 +1,4 @@
1
- export { loadUserFilesClientSide };
1
+ export { loadPageConfigsLazyClientSide };
2
2
  export { isErrorFetchingStaticAssets };
3
3
  export type { PageContextUserFiles };
4
4
  import { type PageFile, type PageConfigUserFriendlyOld } from '../../shared/getPageFiles.js';
@@ -11,5 +11,5 @@ type PageContextUserFiles = {
11
11
  _pageConfigs: PageConfigRuntime[];
12
12
  _pageConfigGlobal: PageConfigGlobalRuntime;
13
13
  };
14
- declare function loadUserFilesClientSide(pageId: string, pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[], pageConfigGlobal: PageConfigGlobalRuntime): Promise<PageContextUserFilesLoaded>;
14
+ declare function loadPageConfigsLazyClientSide(pageId: string, pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[], pageConfigGlobal: PageConfigGlobalRuntime): Promise<PageContextUserFilesLoaded>;
15
15
  declare function isErrorFetchingStaticAssets(err: unknown): boolean;
@@ -1,12 +1,12 @@
1
- export { loadUserFilesClientSide };
1
+ export { loadPageConfigsLazyClientSide };
2
2
  export { isErrorFetchingStaticAssets };
3
3
  import { getPageFilesClientSide } from '../../shared/getPageFiles.js';
4
- import { getPageConfigUserFriendly_oldDesign } from '../../shared/page-configs/getPageConfigUserFriendly.js';
4
+ import { getUserFriendlyConfigsPageLazy } from '../../shared/page-configs/getUserFriendlyConfigs.js';
5
5
  import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
6
6
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
7
7
  import { objectAssign } from '../server-routing-runtime/utils.js';
8
8
  const stamp = '__whileFetchingAssets';
9
- async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs, pageConfigGlobal) {
9
+ async function loadPageConfigsLazyClientSide(pageId, pageFilesAll, pageConfigs, pageConfigGlobal) {
10
10
  const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
11
11
  const pageConfig = findPageConfig(pageConfigs, pageId);
12
12
  let pageConfigLoaded;
@@ -30,7 +30,7 @@ async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs, pageCo
30
30
  }
31
31
  throw err;
32
32
  }
33
- const pageContextExports = getPageConfigUserFriendly_oldDesign(pageFilesClientSide, pageConfigLoaded, pageConfigGlobal);
33
+ const pageContextExports = getUserFriendlyConfigsPageLazy(pageFilesClientSide, pageConfigLoaded, pageConfigGlobal);
34
34
  const pageContextAddendum = {};
35
35
  objectAssign(pageContextAddendum, pageContextExports);
36
36
  objectAssign(pageContextAddendum, { _pageFilesLoaded: pageFilesClientSide });
@@ -56,6 +56,10 @@ const configDefinitionsBuiltIn = {
56
56
  data: {
57
57
  env: { server: true }
58
58
  },
59
+ onData: {
60
+ env: { server: true, client: true },
61
+ cumulative: true
62
+ },
59
63
  iKnowThePerformanceRisksOfAsyncRouteFunctions: {
60
64
  env: { server: true, client: 'if-client-routing' },
61
65
  eager: true
@@ -11,7 +11,7 @@ export type { VikeConfigObject };
11
11
  import type { PageConfigGlobalBuildTime, ConfigValueSource, PageConfigBuildTime } from '../../../../../shared/page-configs/PageConfig.js';
12
12
  import { type ConfigDefinitions, type ConfigDefinitionInternal } from './getVikeConfig/configDefinitionsBuiltIn.js';
13
13
  import type { ResolvedConfig, UserConfig } from 'vite';
14
- import { type PageConfigUserFriendly, type PageConfigsUserFriendly } from '../../../../../shared/page-configs/getPageConfigUserFriendly.js';
14
+ import { type PageConfigUserFriendly, type PageConfigsUserFriendly } from '../../../../../shared/page-configs/getUserFriendlyConfigs.js';
15
15
  import { type PlusFile } from './getVikeConfig/getPlusFilesAll.js';
16
16
  type VikeConfigObject = {
17
17
  pageConfigs: PageConfigBuildTime[];
@@ -21,7 +21,7 @@ import { resolvePointerImport } from './getVikeConfig/resolvePointerImport.js';
21
21
  import { getFilePathResolved } from '../../../shared/getFilePath.js';
22
22
  import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
23
23
  import { assertExtensionsRequire } from './getVikeConfig/assertExtensions.js';
24
- import { getPageConfigGlobalUserFriendly, getPageConfigUserFriendly } from '../../../../../shared/page-configs/getPageConfigUserFriendly.js';
24
+ import { getUserFriendlyConfigsGlobal, getUserFriendlyConfigsPageEager } from '../../../../../shared/page-configs/getUserFriendlyConfigs.js';
25
25
  import { getConfigValuesBase, isJsonValue } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
26
26
  import { getPlusFilesAll } from './getVikeConfig/getPlusFilesAll.js';
27
27
  import { getEnvVarObject } from '../../../shared/getEnvVarObject.js';
@@ -137,7 +137,7 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
137
137
  configDefinitions: {},
138
138
  configValueSources: {}
139
139
  },
140
- global: getPageConfigGlobalUserFriendly({ pageConfigGlobalValues: {} }),
140
+ global: getUserFriendlyConfigsGlobal({ pageConfigGlobalValues: {} }),
141
141
  pages: {},
142
142
  vikeConfigDependencies: new Set()
143
143
  };
@@ -158,13 +158,19 @@ async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
158
158
  setCliAndApiOptions(pageConfigGlobal, configDefinitionsResolved);
159
159
  // global
160
160
  const pageConfigGlobalValues = getConfigValues(pageConfigGlobal);
161
- const global = getPageConfigGlobalUserFriendly({ pageConfigGlobalValues });
161
+ const userFriendlyConfigsGlobal = getUserFriendlyConfigsGlobal({ pageConfigGlobalValues });
162
162
  // pages
163
- const pages = objectFromEntries(pageConfigs.map((pageConfig) => {
163
+ const userFriendlyConfigsPageEager = objectFromEntries(pageConfigs.map((pageConfig) => {
164
164
  const pageConfigValues = getConfigValues(pageConfig, true);
165
- return getPageConfigUserFriendly(pageConfigGlobalValues, pageConfig, pageConfigValues);
165
+ return getUserFriendlyConfigsPageEager(pageConfigGlobalValues, pageConfig, pageConfigValues);
166
166
  }));
167
- return { pageConfigs, pageConfigGlobal, global, pages, vikeConfigDependencies: esbuildCache.vikeConfigDependencies };
167
+ return {
168
+ pageConfigs,
169
+ pageConfigGlobal,
170
+ global: userFriendlyConfigsGlobal,
171
+ pages: userFriendlyConfigsPageEager,
172
+ vikeConfigDependencies: esbuildCache.vikeConfigDependencies
173
+ };
168
174
  }
169
175
  async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
170
176
  const plusFilesAllOrdered = Object.values(plusFilesAll)