vike 0.4.229-commit-845a4e0 → 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 +1 -3
  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 +8 -16
  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 +38 -46
  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 +14 -22
  25. package/dist/esm/client/server-routing-runtime/createPageContextClientSide.d.ts +12 -8
  26. package/dist/esm/client/server-routing-runtime/createPageContextClientSide.js +7 -16
  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 +1 -3
  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 +8 -16
  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 +4 -2
  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
@@ -28,7 +28,7 @@ async function createPageContextClientSide(urlOriginal) {
28
28
  };
29
29
  const pageContextUrlComputed = getPageContextUrlComputed(pageContextCreated);
30
30
  objectAssign(pageContextCreated, pageContextUrlComputed);
31
- const pageContextAugmented = await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal);
31
+ const pageContextAugmented = await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal, globalContext._userFriendlyConfigsGlobal);
32
32
  augmentType(pageContextCreated, pageContextAugmented);
33
33
  return pageContextCreated;
34
34
  }
@@ -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,6 @@ 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
- });
76
68
  let dataHookExists = false;
77
69
  // At this point, we need to call the client-side guard(), data() and onBeforeRender() hooks, if they exist on client
78
70
  // env. However if we have fetched pageContext from the server, some of them might have run already on the
@@ -94,51 +86,51 @@ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
94
86
  dataHookExists = true;
95
87
  if (hookClientOnlyExists(hookName, pageContext) || !pageContext._hasPageContextFromServer) {
96
88
  // This won't do anything if no hook has been defined or if the hook's env.client is false.
97
- const pageContextFromHook = await executeHookClientSide(hookName, pageContext);
98
- assert(!('urlOriginal' in pageContextFromHook));
99
- Object.assign(pageContext, pageContextFromHook);
89
+ await executeDataLikeHook(hookName, pageContext);
100
90
  }
101
91
  }
102
92
  }
103
93
  // Execute +onData
104
94
  if (dataHookExists) {
105
- const hook = getHookFromPageContext(pageContext, 'onData');
106
- if (hook) {
107
- const pageContextForUserConsumption = preparePageContextForUserConsumptionClientSide(pageContext, true);
108
- await executeHook(() => hook.hookFn(pageContextForUserConsumption), hook, pageContext);
109
- }
95
+ await executeHookClient('onData', pageContext);
110
96
  }
111
97
  const pageContextFromClientHooks = pageContext;
112
98
  return pageContextFromClientHooks;
113
99
  }
114
- async function executeHookClientSide(hookName, pageContext) {
115
- const hook = getHookFromPageContext(pageContext, hookName);
116
- if (!hook) {
117
- // No hook defined or hook's env.client is false
118
- return {};
119
- }
120
- const pageContextForUserConsumption = preparePageContextForUserConsumptionClientSide(pageContext, true);
121
- const hookResult = await executeHook(() => hook.hookFn(pageContextForUserConsumption), hook, pageContext);
122
- const pageContextFromHook = {};
123
- if (hookName === 'onBeforeRender') {
124
- assertOnBeforeRenderHookReturn(hookResult, hook.hookFilePath);
125
- // Note: hookResult looks like { pageContext: { ... } }
126
- const pageContextFromOnBeforeRender = hookResult?.pageContext;
127
- if (pageContextFromOnBeforeRender) {
128
- objectAssign(pageContextFromHook, { _hasPageContextFromClient: true });
129
- objectAssign(pageContextFromHook, pageContextFromOnBeforeRender);
130
- }
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);
131
107
  }
132
108
  else {
133
- assert(hookName === 'data');
134
- // Note: hookResult can be anything (e.g. an object) and is to be assigned to pageContext.data
135
- const pageContextFromData = {
136
- data: hookResult
137
- };
138
- if (hookResult) {
139
- objectAssign(pageContextFromHook, { _hasPageContextFromClient: true });
140
- }
141
- 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);
142
134
  }
143
135
  return pageContextFromHook;
144
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)) {
@@ -201,20 +200,15 @@ async function renderPageClientSide(renderArgs) {
201
200
  assert(!('urlOriginal' in pageContextFromServerHooks));
202
201
  objectAssign(pageContext, pageContextFromServerHooks);
203
202
  // Execute +onData
204
- assertHook(pageContext, 'onData');
205
- const hook = getHookFromPageContext(pageContext, 'onData');
206
- if (hook) {
207
- const { hookFn } = hook;
208
- try {
209
- await executeHook(() => hookFn(pageContext), hook, pageContext);
210
- }
211
- catch (err) {
212
- await onError(err);
213
- return;
214
- }
215
- if (isRenderOutdated())
216
- return;
203
+ try {
204
+ await executeHookClient('onData', pageContext);
205
+ }
206
+ catch (err) {
207
+ await onError(err);
208
+ return;
217
209
  }
210
+ if (isRenderOutdated())
211
+ return;
218
212
  // Get pageContext from client-side hooks
219
213
  let pageContextFromClientHooks;
220
214
  try {
@@ -352,7 +346,7 @@ async function renderPageClientSide(renderArgs) {
352
346
  return;
353
347
  }
354
348
  try {
355
- 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));
356
350
  }
357
351
  catch (err) {
358
352
  if (handleErrorFetchingStaticAssets(err, pageContext, isFirstRender)) {
@@ -444,7 +438,6 @@ async function renderPageClientSide(renderArgs) {
444
438
  */
445
439
  // onHydrationEnd()
446
440
  if (isFirstRender && !onRenderClientError) {
447
- assertHook(pageContext, 'onHydrationEnd');
448
441
  const hook = getHookFromPageContext(pageContext, 'onHydrationEnd');
449
442
  if (hook) {
450
443
  const { hookFn } = hook;
@@ -467,7 +460,6 @@ async function renderPageClientSide(renderArgs) {
467
460
  if (globalObject.isTransitioning) {
468
461
  globalObject.isTransitioning = undefined;
469
462
  assert(previousPageContext);
470
- assertHook(previousPageContext, 'onPageTransitionEnd');
471
463
  const hook = getHookFromPageContext(previousPageContext, 'onPageTransitionEnd');
472
464
  if (hook) {
473
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
- } & import("../../shared/getPageFiles.js").PageConfigUserFriendlyOld & {
29
- _pageFilesLoaded: import("../../shared/getPageFiles.js").PageFile[];
30
36
  } & {
31
- config: import("../../types/index.js").ConfigResolved;
32
- _source: import("../../shared/page-configs/getPageConfigUserFriendly.js").Source;
33
- _sources: import("../../shared/page-configs/getPageConfigUserFriendly.js").Sources;
34
- _from: import("../../shared/page-configs/getPageConfigUserFriendly.js").From;
35
37
  isPageContext: true;
38
+ } & import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & import("../../shared/getPageFiles.js").PageConfigUserFriendlyOld & {
39
+ _pageFilesLoaded: import("../../shared/getPageFiles.js").PageFile[];
36
40
  }>;
@@ -1,7 +1,7 @@
1
1
  export { createPageContextClientSide };
2
- import { assertUsage, assertWarning, augmentType, objectAssign } from './utils.js';
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,13 +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
- objectAssign(pageContextCreated, await loadPageUserFiles(pageContextCreated.pageId, pageContextCreated));
29
- const pageContextAugmented = await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal);
27
+ // Sets pageContext.config to global configs
28
+ const pageContextAugmented = await createPageContextShared(pageContextCreated, globalContext._pageConfigGlobal, globalContext._userFriendlyConfigsGlobal);
30
29
  augmentType(pageContextCreated, pageContextAugmented);
30
+ // Sets pageContext.config to local configs (overrides the pageContext.config set above)
31
+ objectAssign(pageContextCreated, await loadPageConfigsLazyClientSide(pageContextCreated.pageId, pageContextCreated._pageFilesAll, pageContextCreated._pageConfigs, pageContextCreated._pageConfigGlobal));
31
32
  assertPristineUrl();
32
33
  return pageContextCreated;
33
34
  }
@@ -35,13 +36,3 @@ function assertPristineUrl() {
35
36
  const urlCurrent = getCurrentUrl({ withoutHash: true });
36
37
  assertUsage(urlFirst === urlCurrent, `The URL was manipulated before the hydration finished ('${urlFirst}' to '${urlCurrent}'). Ensure the hydration has finished before manipulating the URL. Consider using the onHydrationEnd() hook.`);
37
38
  }
38
- async function loadPageUserFiles(pageId, pageContext) {
39
- const pageContextAddendum = {};
40
- objectAssign(pageContextAddendum, await loadUserFilesClientSide(pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
41
- pageContext._pageFilesAll
42
- .filter((p) => p.fileType !== '.page.server')
43
- .forEach((p) => {
44
- assertWarning(!p.fileExports?.onBeforeRender, `export { onBeforeRender } of ${p.filePath} is loaded in the browser but never executed (because you are using Server-side Routing). In order to reduce the size of you browser-side JavaScript, define onBeforeRender() in a .page.server.js file instead, see https://vike.dev/onBeforeRender-isomorphic#server-routing`, { onlyOnce: true });
45
- });
46
- return pageContextAddendum;
47
- }
@@ -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 });
@@ -57,10 +57,8 @@ const configDefinitionsBuiltIn = {
57
57
  env: { server: true }
58
58
  },
59
59
  onData: {
60
- env: { server: true, client: true }
61
- /* TODO/now
60
+ env: { server: true, client: true },
62
61
  cumulative: true
63
- */
64
62
  },
65
63
  iKnowThePerformanceRisksOfAsyncRouteFunctions: {
66
64
  env: { server: true, client: 'if-client-routing' },
@@ -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)