vike 0.4.229-commit-58f7ed0 → 0.4.229-commit-5da80bf

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 (173) hide show
  1. package/dist/cjs/client/server-routing-runtime/utils.js +1 -0
  2. package/dist/cjs/client/shared/{preparePageContextForUserConsumptionClientSide.js → preparePageContextForPublicUsageClientShared.js} +15 -19
  3. package/dist/cjs/node/api/build.js +1 -5
  4. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +4 -0
  5. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +12 -6
  6. package/dist/cjs/node/plugin/shared/loggerNotProd.js +2 -2
  7. package/dist/cjs/node/prerender/runPrerender.js +42 -38
  8. package/dist/cjs/node/prerender/utils.js +1 -1
  9. package/dist/cjs/node/runtime/globalContext.js +13 -27
  10. package/dist/cjs/node/runtime/html/serializeContext.js +1 -1
  11. package/dist/cjs/node/runtime/renderPage/createHttpResponse/getCacheControl.js +7 -5
  12. package/dist/cjs/node/runtime/renderPage/createHttpResponse.js +0 -1
  13. package/dist/cjs/node/runtime/renderPage/createPageContextServerSide.js +6 -9
  14. package/dist/cjs/node/runtime/renderPage/execHookServer.js +11 -0
  15. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +14 -15
  16. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -12
  17. package/dist/cjs/node/runtime/renderPage/{loadUserFilesServerSide.js → loadPageConfigsLazyServerSide.js} +4 -4
  18. package/dist/cjs/node/runtime/renderPage/preparePageContextForPublicUsageServer.js +10 -0
  19. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -5
  20. package/dist/cjs/node/runtime/renderPage.js +9 -7
  21. package/dist/cjs/node/runtime/utils.js +1 -1
  22. package/dist/cjs/shared/NOT_SERIALIZABLE.js +0 -1
  23. package/dist/cjs/shared/addIs404ToPageProps.js +0 -7
  24. package/dist/cjs/shared/createGlobalContextShared.js +37 -8
  25. package/dist/cjs/shared/createPageContextShared.js +16 -11
  26. package/dist/cjs/shared/getPageContext.js +3 -3
  27. package/dist/cjs/shared/getPageContextUrlComputed.js +2 -36
  28. package/dist/cjs/shared/getProxyForPublicUsage.js +106 -0
  29. package/dist/cjs/shared/hooks/execHook.js +164 -0
  30. package/dist/cjs/shared/hooks/getHook.js +23 -4
  31. package/dist/cjs/shared/page-configs/{getPageConfigUserFriendly.js → getUserFriendlyConfigs.js} +54 -47
  32. package/dist/cjs/shared/prepareGlobalContextForPublicUsage.js +10 -0
  33. package/dist/cjs/shared/preparePageContextForPublicUsage.js +75 -0
  34. package/dist/cjs/shared/route/abort.js +2 -2
  35. package/dist/cjs/shared/route/executeGuardHook.js +4 -9
  36. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +4 -3
  37. package/dist/cjs/shared/route/index.js +2 -4
  38. package/dist/cjs/shared/route/loadPageRoutes.js +6 -0
  39. package/dist/cjs/shared/route/resolveRouteFunction.js +14 -10
  40. package/dist/cjs/shared/utils.js +2 -0
  41. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  42. package/dist/cjs/utils/objectAssign.js +3 -3
  43. package/dist/cjs/utils/objectDefineProperty.js +1 -1
  44. package/dist/esm/client/client-routing-runtime/{createPageContext.d.ts → createPageContextClientSide.d.ts} +21 -13
  45. package/dist/esm/client/client-routing-runtime/{createPageContext.js → createPageContextClientSide.js} +9 -11
  46. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +400 -15
  47. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +46 -44
  48. package/dist/esm/client/client-routing-runtime/globalContext.d.ts +11 -1
  49. package/dist/esm/client/client-routing-runtime/prefetch.d.ts +3 -8
  50. package/dist/esm/client/client-routing-runtime/prefetch.js +3 -3
  51. package/dist/esm/client/client-routing-runtime/preparePageContextForPublicUsageClient.d.ts +11 -0
  52. package/dist/esm/client/client-routing-runtime/preparePageContextForPublicUsageClient.js +5 -0
  53. package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +135 -0
  54. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +79 -78
  55. package/dist/esm/client/client-routing-runtime/utils.d.ts +1 -0
  56. package/dist/esm/client/client-routing-runtime/utils.js +1 -0
  57. package/dist/esm/client/server-routing-runtime/createPageContextClientSide.d.ts +19 -13
  58. package/dist/esm/client/server-routing-runtime/createPageContextClientSide.js +12 -15
  59. package/dist/esm/client/server-routing-runtime/entry.js +4 -4
  60. package/dist/esm/client/server-routing-runtime/globalContext.d.ts +11 -1
  61. package/dist/esm/client/server-routing-runtime/preparePageContextForPublicUsageClient.d.ts +9 -0
  62. package/dist/esm/client/server-routing-runtime/preparePageContextForPublicUsageClient.js +5 -0
  63. package/dist/esm/client/server-routing-runtime/utils.d.ts +1 -0
  64. package/dist/esm/client/server-routing-runtime/utils.js +1 -0
  65. package/dist/esm/client/shared/createGetGlobalContextClient.d.ts +11 -1
  66. package/dist/esm/client/shared/executeOnRenderClientHook.d.ts +3 -3
  67. package/dist/esm/client/shared/executeOnRenderClientHook.js +4 -13
  68. package/dist/esm/client/shared/{loadUserFilesClientSide.d.ts → loadPageConfigsLazyClientSide.d.ts} +2 -2
  69. package/dist/esm/client/shared/{loadUserFilesClientSide.js → loadPageConfigsLazyClientSide.js} +4 -4
  70. package/dist/esm/client/shared/preparePageContextForPublicUsageClientShared.d.ts +11 -0
  71. package/dist/esm/client/shared/preparePageContextForPublicUsageClientShared.js +40 -0
  72. package/dist/esm/node/api/build.js +1 -2
  73. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +4 -0
  74. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +1 -1
  75. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +12 -6
  76. package/dist/esm/node/plugin/shared/loggerNotProd.js +1 -1
  77. package/dist/esm/node/prerender/runPrerender.d.ts +37 -73
  78. package/dist/esm/node/prerender/runPrerender.js +42 -38
  79. package/dist/esm/node/prerender/utils.d.ts +1 -1
  80. package/dist/esm/node/prerender/utils.js +1 -1
  81. package/dist/esm/node/runtime/globalContext.d.ts +46 -251
  82. package/dist/esm/node/runtime/globalContext.js +14 -28
  83. package/dist/esm/node/runtime/html/serializeContext.d.ts +1 -1
  84. package/dist/esm/node/runtime/html/serializeContext.js +1 -1
  85. package/dist/esm/node/runtime/renderPage/createHttpResponse/getCacheControl.d.ts +1 -1
  86. package/dist/esm/node/runtime/renderPage/createHttpResponse/getCacheControl.js +7 -5
  87. package/dist/esm/node/runtime/renderPage/createHttpResponse.js +0 -1
  88. package/dist/esm/node/runtime/renderPage/createPageContextServerSide.d.ts +26 -41
  89. package/dist/esm/node/runtime/renderPage/createPageContextServerSide.js +7 -10
  90. package/dist/esm/node/runtime/renderPage/execHookServer.d.ts +12 -0
  91. package/dist/esm/node/runtime/renderPage/execHookServer.js +9 -0
  92. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +2 -3
  93. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +14 -15
  94. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.d.ts +4 -2
  95. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -12
  96. package/dist/esm/node/runtime/renderPage/{loadUserFilesServerSide.d.ts → loadPageConfigsLazyServerSide.d.ts} +6 -6
  97. package/dist/esm/node/runtime/renderPage/{loadUserFilesServerSide.js → loadPageConfigsLazyServerSide.js} +4 -4
  98. package/dist/esm/node/runtime/renderPage/preparePageContextForPublicUsageServer.d.ts +20 -0
  99. package/dist/esm/node/runtime/renderPage/preparePageContextForPublicUsageServer.js +8 -0
  100. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +38 -74
  101. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -5
  102. package/dist/esm/node/runtime/renderPage.d.ts +21 -39
  103. package/dist/esm/node/runtime/renderPage.js +9 -7
  104. package/dist/esm/node/runtime/utils.d.ts +1 -1
  105. package/dist/esm/node/runtime/utils.js +1 -1
  106. package/dist/esm/shared/NOT_SERIALIZABLE.js +0 -1
  107. package/dist/esm/shared/addIs404ToPageProps.d.ts +1 -6
  108. package/dist/esm/shared/addIs404ToPageProps.js +1 -8
  109. package/dist/esm/shared/createGlobalContextShared.d.ts +28 -6
  110. package/dist/esm/shared/createGlobalContextShared.js +37 -8
  111. package/dist/esm/shared/createPageContextShared.d.ts +7 -6
  112. package/dist/esm/shared/createPageContextShared.js +17 -12
  113. package/dist/esm/shared/getPageContext.d.ts +1 -1
  114. package/dist/esm/shared/getPageContext.js +1 -1
  115. package/dist/esm/shared/getPageContextUrlComputed.d.ts +2 -5
  116. package/dist/esm/shared/getPageContextUrlComputed.js +3 -37
  117. package/dist/esm/shared/getPageFiles.d.ts +1 -1
  118. package/dist/esm/shared/getProxyForPublicUsage.d.ts +12 -0
  119. package/dist/esm/shared/getProxyForPublicUsage.js +104 -0
  120. package/dist/esm/shared/hooks/execHook.d.ts +63 -0
  121. package/dist/esm/shared/hooks/execHook.js +162 -0
  122. package/dist/esm/shared/hooks/getHook.d.ts +10 -11
  123. package/dist/esm/shared/hooks/getHook.js +23 -4
  124. package/dist/esm/shared/page-configs/Config.d.ts +11 -4
  125. package/dist/esm/shared/page-configs/{getPageConfigUserFriendly.d.ts → getUserFriendlyConfigs.d.ts} +8 -6
  126. package/dist/esm/shared/page-configs/{getPageConfigUserFriendly.js → getUserFriendlyConfigs.js} +55 -48
  127. package/dist/esm/shared/prepareGlobalContextForPublicUsage.d.ts +7 -0
  128. package/dist/esm/shared/prepareGlobalContextForPublicUsage.js +8 -0
  129. package/dist/esm/shared/preparePageContextForPublicUsage.d.ts +12 -0
  130. package/dist/esm/shared/preparePageContextForPublicUsage.js +73 -0
  131. package/dist/esm/shared/route/abort.js +1 -1
  132. package/dist/esm/shared/route/executeGuardHook.d.ts +4 -3
  133. package/dist/esm/shared/route/executeGuardHook.js +4 -9
  134. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +4 -3
  135. package/dist/esm/shared/route/index.js +2 -4
  136. package/dist/esm/shared/route/loadPageRoutes.d.ts +2 -1
  137. package/dist/esm/shared/route/loadPageRoutes.js +7 -1
  138. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  139. package/dist/esm/shared/route/resolveRouteFunction.js +14 -10
  140. package/dist/esm/shared/types.d.ts +14 -4
  141. package/dist/esm/shared/utils.d.ts +2 -0
  142. package/dist/esm/shared/utils.js +2 -0
  143. package/dist/esm/types/index.d.ts +1 -1
  144. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  145. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  146. package/dist/esm/utils/objectAssign.d.ts +1 -1
  147. package/dist/esm/utils/objectAssign.js +3 -3
  148. package/dist/esm/utils/objectDefineProperty.d.ts +0 -1
  149. package/dist/esm/utils/objectDefineProperty.js +1 -1
  150. package/package.json +2 -2
  151. package/dist/cjs/client/shared/getPageContextProxyForUser.js +0 -16
  152. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +0 -16
  153. package/dist/cjs/shared/getPageConfigsRuntime.js +0 -23
  154. package/dist/cjs/shared/hooks/executeHook.js +0 -87
  155. package/dist/cjs/shared/hooks/executeHookGeneric.js +0 -18
  156. package/dist/cjs/shared/preparePageContextForUserConsumption.js +0 -34
  157. package/dist/cjs/utils/getPublicProxy.js +0 -27
  158. package/dist/esm/client/shared/getPageContextProxyForUser.d.ts +0 -2
  159. package/dist/esm/client/shared/getPageContextProxyForUser.js +0 -14
  160. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +0 -12
  161. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.js +0 -44
  162. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +0 -24
  163. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +0 -14
  164. package/dist/esm/shared/getPageConfigsRuntime.d.ts +0 -14
  165. package/dist/esm/shared/getPageConfigsRuntime.js +0 -21
  166. package/dist/esm/shared/hooks/executeHook.d.ts +0 -21
  167. package/dist/esm/shared/hooks/executeHook.js +0 -85
  168. package/dist/esm/shared/hooks/executeHookGeneric.d.ts +0 -8
  169. package/dist/esm/shared/hooks/executeHookGeneric.js +0 -16
  170. package/dist/esm/shared/preparePageContextForUserConsumption.d.ts +0 -5
  171. package/dist/esm/shared/preparePageContextForUserConsumption.js +0 -32
  172. package/dist/esm/utils/getPublicProxy.d.ts +0 -2
  173. package/dist/esm/utils/getPublicProxy.js +0 -25
@@ -3,12 +3,11 @@ export { getPageContextFromHooks_serialized };
3
3
  export { getPageContextFromServerHooks };
4
4
  export { getPageContextFromClientHooks };
5
5
  export { setPageContextInitIsPassedToClient };
6
+ export { execHookClient };
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
- import { preparePageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
12
11
  import { removeBuiltInOverrides } from './getPageContext/removeBuiltInOverrides.js';
13
12
  import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
14
13
  import { getPageConfig } from '../../shared/page-configs/helpers.js';
@@ -18,9 +17,10 @@ import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
18
17
  import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
19
18
  import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
20
19
  import { isServerSideError } from '../../shared/misc/isServerSideError.js';
21
- import { executeHook } from '../../shared/hooks/executeHook.js';
20
+ import { execHook } from '../../shared/hooks/execHook.js';
21
+ import { preparePageContextForPublicUsageClient } from './preparePageContextForPublicUsageClient.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.
@@ -85,50 +78,59 @@ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
85
78
  !pageContext._hasPageContextFromServer) {
86
79
  // Should we really call the guard() hook on the client-side? Shouldn't we make the guard() hook a server-side
87
80
  // only hook? Or maybe make its env configurable like data() and onBeforeRender()?
88
- await executeGuardHook(pageContext, (pageContext) => preparePageContextForUserConsumptionClientSide(pageContext, true));
81
+ await executeGuardHook(pageContext, (pageContext) => preparePageContextForPublicUsageClient(pageContext));
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 execHookClient('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 execHookClient(hookName, pageContext) {
101
+ return await execHook(hookName, pageContext, (p) => preparePageContextForPublicUsageClient(p));
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 execHookClient('data', pageContext);
115
+ const hook = res[0]; // TO-DO/soon: support cumulative
116
+ if (!hook)
117
+ return;
118
+ const { hookReturn } = hook;
119
+ const pageContextAddendum = { data: hookReturn };
120
+ return pageContextAddendum;
121
+ }
122
+ async function executeOnBeforeRenderHook(pageContext) {
123
+ const res = await execHookClient('onBeforeRender', pageContext);
124
+ const hook = res[0]; // TO-DO/soon: support cumulative
125
+ if (!hook)
126
+ return;
127
+ const { hookReturn, hookFilePath } = hook;
128
+ const pageContextFromHook = {};
129
+ assertOnBeforeRenderHookReturn(hookReturn, hookFilePath);
130
+ // Note: hookReturn looks like { pageContext: { ... } }
131
+ const pageContextFromOnBeforeRender = hookReturn?.pageContext;
132
+ if (pageContextFromOnBeforeRender) {
133
+ objectAssign(pageContextFromHook, pageContextFromOnBeforeRender);
132
134
  }
133
135
  return pageContextFromHook;
134
136
  }
@@ -5,13 +5,23 @@ type GlobalContextClient = GlobalContextSharedPublic & Pick<GlobalContextClientI
5
5
  type GlobalContextClientInternal = Awaited<ReturnType<typeof getGlobalContextClientInternal>>;
6
6
  declare const getGlobalContextClientInternal: () => Promise<{
7
7
  isGlobalContext: true;
8
+ _isOriginalObject: true;
8
9
  _virtualFileExports: unknown;
9
10
  _pageFilesAll: import("../../shared/getPageFiles.js").PageFile[];
10
11
  _pageConfigs: import("../../__internal/index.js").PageConfig[];
11
12
  _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
12
13
  _allPageIds: string[];
14
+ _userFriendlyConfigsGlobal: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly;
13
15
  config: import("../../types/index.js").ConfigResolved;
14
- pages: import("../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
16
+ pages: {
17
+ [k: string]: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & ({
18
+ route: import("../../shared/page-configs/Config.js").Route;
19
+ isErrorPage?: undefined;
20
+ } | {
21
+ route?: undefined;
22
+ isErrorPage: true;
23
+ });
24
+ };
15
25
  } & {
16
26
  isClientSide: true;
17
27
  } & {
@@ -5,17 +5,12 @@ export { populatePageContextPrefetchCache };
5
5
  export { addLinkPrefetchHandlers };
6
6
  export { addLinkPrefetchHandlers_watch };
7
7
  export { addLinkPrefetchHandlers_unwatch };
8
+ import { type PageContextCreated } from './createPageContextClientSide.js';
8
9
  import { type PageContextFromServerHooks, getPageContextFromServerHooks } from './getPageContextFromHooks.js';
9
- import type { PageConfigUserFriendlyOld, PageFile } from '../../shared/getPageFiles.js';
10
- import { type PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
10
+ import type { PageConfigUserFriendlyOld } from '../../shared/getPageFiles.js';
11
11
  type ResultPageContextFromServer = Awaited<ReturnType<typeof getPageContextFromServerHooks>>;
12
- type PageContextForPrefetch = {
13
- urlOriginal: string;
14
- urlPathname: string;
12
+ type PageContextForPrefetch = PageContextCreated & {
15
13
  pageId: string;
16
- _urlRewrite: null;
17
- _pageFilesAll: PageFile[];
18
- _pageConfigs: PageConfigRuntime[];
19
14
  };
20
15
  declare function getPageContextPrefetched(pageContext: {
21
16
  urlPathname: string;
@@ -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)) {
@@ -0,0 +1,11 @@
1
+ export { preparePageContextForPublicUsageClient };
2
+ export type { PageContextForPublicUsageClient };
3
+ import type { PageConfigUserFriendlyOld } from '../../shared/getPageFiles.js';
4
+ import type { PageContextInternalClient_ClientRouting } from '../../shared/types.js';
5
+ import type { PageContextPrepareMinimum } from '../../shared/preparePageContextForPublicUsage.js';
6
+ type PageContextForPublicUsageClient = PageContextPrepareMinimum & PageContextInternalClient_ClientRouting & PageConfigUserFriendlyOld & {
7
+ urlOriginal: string;
8
+ };
9
+ declare function preparePageContextForPublicUsageClient<PageContext extends PageContextForPublicUsageClient>(pageContext: PageContext): PageContext & {
10
+ Page: unknown;
11
+ };
@@ -0,0 +1,5 @@
1
+ export { preparePageContextForPublicUsageClient };
2
+ import { preparePageContextForPublicUsageClientShared } from '../shared/preparePageContextForPublicUsageClientShared.js';
3
+ function preparePageContextForPublicUsageClient(pageContext) {
4
+ return preparePageContextForPublicUsageClientShared(pageContext);
5
+ }
@@ -3,10 +3,17 @@ export { getRenderCount };
3
3
  export { disableClientRouting };
4
4
  export { firstRenderStartPromise };
5
5
  export { getPageContextClient };
6
+ export type { PageContextBegin };
6
7
  import { type PageContextFromRewrite } from '../../shared/route/abort.js';
7
8
  import { type ScrollTarget } from './setScrollPosition.js';
9
+ import type { PageConfigUserFriendlyOld } from '../../shared/getPageFiles.js';
8
10
  import type { PageContextClient } from '../../shared/types.js';
9
11
  declare const firstRenderStartPromise: Promise<void>;
12
+ type PageContextRouted = {
13
+ pageId: string;
14
+ routeParams: Record<string, string>;
15
+ };
16
+ type PageContextBegin = Awaited<ReturnType<typeof getPageContextBegin>>;
10
17
  type RenderArgs = {
11
18
  scrollTarget: ScrollTarget;
12
19
  isBackwardNavigation: boolean | null;
@@ -19,6 +26,134 @@ type RenderArgs = {
19
26
  pageContextInitClient?: Record<string, unknown>;
20
27
  };
21
28
  declare function renderPageClientSide(renderArgs: RenderArgs): Promise<void>;
29
+ declare function getPageContextBegin(isForErrorPage: boolean, { urlOriginal, isBackwardNavigation, pageContextsFromRewrite, isClientSideNavigation, pageContextInitClient, isFirstRender }: {
30
+ urlOriginal: string;
31
+ isBackwardNavigation: boolean | null;
32
+ pageContextsFromRewrite: PageContextFromRewrite[];
33
+ isClientSideNavigation: boolean;
34
+ pageContextInitClient: Record<string, unknown> | undefined;
35
+ isFirstRender: boolean;
36
+ }): Promise<{
37
+ _isOriginalObject: true;
38
+ isPageContext: true;
39
+ } & {
40
+ isClientSide: true;
41
+ isPrerendering: false;
42
+ urlOriginal: string;
43
+ _globalContext: {
44
+ isGlobalContext: true;
45
+ _isOriginalObject: true;
46
+ _virtualFileExports: unknown;
47
+ _pageFilesAll: import("../../shared/getPageFiles.js").PageFile[];
48
+ _pageConfigs: import("../../__internal/index.js").PageConfig[];
49
+ _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
50
+ _allPageIds: string[];
51
+ _userFriendlyConfigsGlobal: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly;
52
+ config: import("../../types/index.js").ConfigResolved;
53
+ pages: {
54
+ [k: string]: import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & ({
55
+ route: import("../../shared/page-configs/Config.js").Route;
56
+ isErrorPage?: undefined;
57
+ } | {
58
+ route?: undefined;
59
+ isErrorPage: true;
60
+ });
61
+ };
62
+ } & {
63
+ isClientSide: true;
64
+ } & {
65
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
66
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
67
+ };
68
+ _pageFilesAll: import("../../shared/getPageFiles.js").PageFile[];
69
+ _pageConfigs: import("../../__internal/index.js").PageConfig[];
70
+ _pageConfigGlobal: import("../../shared/page-configs/PageConfig.js").PageConfigGlobalRuntime;
71
+ _allPageIds: string[];
72
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
73
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
74
+ _urlHandler: null;
75
+ _urlRewrite: null | string;
76
+ _baseServer: string;
77
+ } & {
78
+ urlParsed: import("./utils.js").UrlPublic;
79
+ urlPathname: string;
80
+ url: string;
81
+ } & import("../../shared/page-configs/getUserFriendlyConfigs.js").PageConfigUserFriendly & {
82
+ isBackwardNavigation: boolean | null;
83
+ isClientSideNavigation: boolean;
84
+ isHydration: boolean;
85
+ previousPageContext: ({
86
+ pageId: string;
87
+ } & PageConfigUserFriendlyOld & PageContextRouted & import("../../shared/preparePageContextForPublicUsage.js").PageContextPrepareMinimum & import("../../shared/types.js").PageContextInternalClient & Omit<Partial<{
88
+ isPageContext: true;
89
+ Page: import("../../types/index.js").Config["Page"];
90
+ routeParams: Record<string, string>;
91
+ data: unknown;
92
+ config: import("../../shared/page-configs/Config/PageContextConfig.js").PageContextConfig;
93
+ configEntries: import("../../types/index.js").ConfigEntries;
94
+ exports: Record<string, unknown>;
95
+ exportsAll: import("../../shared/getPageFiles.js").ExportsAll;
96
+ urlOriginal: string;
97
+ headers: Record<string, string> | null;
98
+ headersOriginal?: unknown;
99
+ is404: boolean | null;
100
+ isClientSideNavigation: boolean;
101
+ abortReason?: unknown;
102
+ abortStatusCode?: import("../../shared/route/abort.js").AbortStatusCode;
103
+ errorWhileRendering?: unknown;
104
+ pageId: string | null;
105
+ from: import("../../shared/page-configs/getUserFriendlyConfigs.js").From;
106
+ source: import("../../shared/page-configs/getUserFriendlyConfigs.js").Source;
107
+ sources: import("../../shared/page-configs/getUserFriendlyConfigs.js").Sources;
108
+ url: string;
109
+ pageExports: Record<string, unknown>;
110
+ isBaseMissing?: true;
111
+ }> & Pick<{
112
+ isPageContext: true;
113
+ Page: import("../../types/index.js").Config["Page"];
114
+ routeParams: Record<string, string>;
115
+ data: unknown;
116
+ config: import("../../shared/page-configs/Config/PageContextConfig.js").PageContextConfig;
117
+ configEntries: import("../../types/index.js").ConfigEntries;
118
+ exports: Record<string, unknown>;
119
+ exportsAll: import("../../shared/getPageFiles.js").ExportsAll;
120
+ urlOriginal: string;
121
+ headers: Record<string, string> | null;
122
+ headersOriginal?: unknown;
123
+ is404: boolean | null;
124
+ isClientSideNavigation: boolean;
125
+ abortReason?: unknown;
126
+ abortStatusCode?: import("../../shared/route/abort.js").AbortStatusCode;
127
+ errorWhileRendering?: unknown;
128
+ pageId: string | null;
129
+ from: import("../../shared/page-configs/getUserFriendlyConfigs.js").From;
130
+ source: import("../../shared/page-configs/getUserFriendlyConfigs.js").Source;
131
+ sources: import("../../shared/page-configs/getUserFriendlyConfigs.js").Sources;
132
+ url: string;
133
+ pageExports: Record<string, unknown>;
134
+ isBaseMissing?: true;
135
+ }, "exports" | "pageId" | "Page" | "data" | "config" | "pageExports" | "routeParams" | "configEntries" | "exportsAll" | "abortReason" | "source" | "sources" | "from"> & {
136
+ isClientSide: true;
137
+ isPrerendering: false;
138
+ } & {
139
+ isHydration: boolean;
140
+ isBackwardNavigation: boolean | null;
141
+ previousPageContext: PageContextClient<unknown> | null;
142
+ globalContext: import("./globalContext.js").GlobalContextClient;
143
+ } & {
144
+ urlOriginal: string;
145
+ } & {
146
+ urlParsed: import("./utils.js").UrlPublic;
147
+ urlPathname: string;
148
+ url: string;
149
+ }, ("globalContext" | "Page" | "data") | "previousPageContext"> & {
150
+ previousPageContext: {
151
+ pageId: string;
152
+ } | null;
153
+ } & {
154
+ urlOriginal: string;
155
+ }) | null;
156
+ }>;
22
157
  declare global {
23
158
  var _vike: {
24
159
  fullyRenderedUrl?: string;
@@ -4,13 +4,12 @@ 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, execHookClient } 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 { isErrorFetchingStaticAssets, loadPageConfigsLazyClientSide } from '../shared/loadPageConfigsLazyClientSide.js';
14
13
  import { pushHistoryState } from './history.js';
15
14
  import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled } from '../../shared/route/abort.js';
16
15
  import { route } from '../../shared/route/index.js';
@@ -21,7 +20,10 @@ import { getErrorPageId } from '../../shared/error-page.js';
21
20
  import { setPageContextCurrent } from './getPageContextCurrent.js';
22
21
  import { getRouteStringParameterList } from '../../shared/route/resolveRouteString.js';
23
22
  import { getCurrentUrl } from '../shared/getCurrentUrl.js';
24
- import { executeHook } from '../../shared/hooks/executeHook.js';
23
+ import { execHooksErrorHandling, execHookErrorHandling } from '../../shared/hooks/execHook.js';
24
+ import { preparePageContextForPublicUsageClient } from './preparePageContextForPublicUsageClient.js';
25
+ import { getHookFromPageContextNew } from '../../shared/hooks/getHook.js';
26
+ import { preparePageContextForPublicUsageClientMinimal } from '../shared/preparePageContextForPublicUsageClientShared.js';
25
27
  const globalObject = getGlobalObject('client-routing-runtime/renderPageClientSide.ts', (() => {
26
28
  const { promise: firstRenderStartPromise, resolve: firstRenderStartPromiseResolve } = genPromise();
27
29
  return {
@@ -39,6 +41,14 @@ async function renderPageClientSide(renderArgs) {
39
41
  addLinkPrefetchHandlers_unwatch();
40
42
  const { isRenderOutdated, setHydrationCanBeAborted, isFirstRender } = getIsRenderOutdated();
41
43
  assertNoInfiniteAbortLoop(pageContextsFromRewrite.length, redirectCount);
44
+ const pageContextBeginArgs = {
45
+ urlOriginal,
46
+ isBackwardNavigation,
47
+ pageContextsFromRewrite,
48
+ isClientSideNavigation,
49
+ pageContextInitClient,
50
+ isFirstRender
51
+ };
42
52
  if (globalObject.clientRoutingIsDisabled) {
43
53
  redirectHard(urlOriginal);
44
54
  return;
@@ -52,7 +62,7 @@ async function renderPageClientSide(renderArgs) {
52
62
  const onError = async (err) => {
53
63
  await renderErrorPage({ err });
54
64
  };
55
- const pageContext = await getPageContextBegin(false);
65
+ const pageContext = await getPageContextBegin(false, pageContextBeginArgs);
56
66
  if (isRenderOutdated())
57
67
  return;
58
68
  // onPageTransitionStart()
@@ -60,23 +70,16 @@ async function renderPageClientSide(renderArgs) {
60
70
  assert(previousPageContext);
61
71
  // 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
72
  // https://github.com/vikejs/vike/issues/1560
63
- assertHook(previousPageContext, 'onPageTransitionStart');
64
73
  if (!globalObject.isTransitioning) {
65
74
  globalObject.isTransitioning = true;
66
- const onPageTransitionStartHook = getHookFromPageContext(previousPageContext, 'onPageTransitionStart');
67
- if (onPageTransitionStartHook) {
68
- const hook = onPageTransitionStartHook;
69
- const { hookFn } = hook;
70
- try {
71
- await executeHook(() => hookFn(pageContext), hook, pageContext);
72
- }
73
- catch (err) {
74
- await onError(err);
75
- return;
76
- }
77
- if (isRenderOutdated())
78
- return;
75
+ const hooks = getHookFromPageContextNew('onPageTransitionStart', previousPageContext);
76
+ const res = await execHooksErrorHandling(hooks, pageContext, preparePageContextForPublicUsageClientMinimal);
77
+ if ('err' in res) {
78
+ await onError(res.err);
79
+ return;
79
80
  }
81
+ if (isRenderOutdated())
82
+ return;
80
83
  }
81
84
  }
82
85
  // Route
@@ -132,7 +135,7 @@ async function renderPageClientSide(renderArgs) {
132
135
  objectAssign(pageContext, pageContextFromRoute);
133
136
  }
134
137
  try {
135
- objectAssign(pageContext, await loadUserFilesClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
138
+ objectAssign(pageContext, await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
136
139
  }
137
140
  catch (err) {
138
141
  if (handleErrorFetchingStaticAssets(err, pageContext, isFirstRender)) {
@@ -200,6 +203,16 @@ async function renderPageClientSide(renderArgs) {
200
203
  // TO-DO/eventually: create helper assertPageContextFromHook()
201
204
  assert(!('urlOriginal' in pageContextFromServerHooks));
202
205
  objectAssign(pageContext, pageContextFromServerHooks);
206
+ // Execute +onData
207
+ try {
208
+ await execHookClient('onData', pageContext);
209
+ }
210
+ catch (err) {
211
+ await onError(err);
212
+ return;
213
+ }
214
+ if (isRenderOutdated())
215
+ return;
203
216
  // Get pageContext from client-side hooks
204
217
  let pageContextFromClientHooks;
205
218
  try {
@@ -215,33 +228,6 @@ async function renderPageClientSide(renderArgs) {
215
228
  await renderPageView(pageContext);
216
229
  }
217
230
  }
218
- async function getPageContextBegin(isForErrorPage) {
219
- const pageContext = await createPageContextClientSide(urlOriginal);
220
- objectAssign(pageContext, {
221
- isBackwardNavigation,
222
- isClientSideNavigation,
223
- isHydration: isFirstRender && !isForErrorPage,
224
- previousPageContext,
225
- ...pageContextInitClient
226
- });
227
- // TODO/next-major-release: remove
228
- Object.defineProperty(pageContext, '_previousPageContext', {
229
- get() {
230
- assertWarning(false, 'pageContext._previousPageContext has been renamed pageContext.previousPageContext', {
231
- showStackTrace: true,
232
- onlyOnce: true
233
- });
234
- return previousPageContext;
235
- },
236
- enumerable: false
237
- });
238
- {
239
- const pageContextFromAllRewrites = getPageContextFromAllRewrites(pageContextsFromRewrite);
240
- assert(!('urlOriginal' in pageContextFromAllRewrites));
241
- objectAssign(pageContext, pageContextFromAllRewrites);
242
- }
243
- return pageContext;
244
- }
245
231
  async function renderErrorPage(args) {
246
232
  const onError = (err) => {
247
233
  if (!isSameErrorMessage(err, args.err)) {
@@ -267,9 +253,10 @@ async function renderPageClientSide(renderArgs) {
267
253
  // We handle the abort error down below.
268
254
  }
269
255
  }
270
- const pageContext = await getPageContextBegin(true);
256
+ const pageContext = await getPageContextBegin(true, pageContextBeginArgs);
271
257
  if (isRenderOutdated())
272
258
  return;
259
+ objectAssign(pageContext, { routeParams: {} });
273
260
  if (args.is404)
274
261
  objectAssign(pageContext, { is404: true });
275
262
  if (args.pageContextError)
@@ -337,7 +324,7 @@ async function renderPageClientSide(renderArgs) {
337
324
  return;
338
325
  }
339
326
  try {
340
- objectAssign(pageContext, await loadUserFilesClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
327
+ objectAssign(pageContext, await loadPageConfigsLazyClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageConfigGlobal));
341
328
  }
342
329
  catch (err) {
343
330
  if (handleErrorFetchingStaticAssets(err, pageContext, isFirstRender)) {
@@ -379,7 +366,6 @@ async function renderPageClientSide(renderArgs) {
379
366
  if (isRenderOutdated())
380
367
  return;
381
368
  augmentType(pageContext, pageContextFromClientHooks);
382
- objectAssign(pageContext, { routeParams: {} });
383
369
  await renderPageView(pageContext, args);
384
370
  }
385
371
  async function renderPageView(pageContext, isErrorPage) {
@@ -407,7 +393,7 @@ async function renderPageClientSide(renderArgs) {
407
393
  const onRenderClientPromise = (async () => {
408
394
  let onRenderClientError;
409
395
  try {
410
- await executeOnRenderClientHook(pageContext, true);
396
+ await executeOnRenderClientHook(pageContext, preparePageContextForPublicUsageClient);
411
397
  }
412
398
  catch (err) {
413
399
  onRenderClientError = err;
@@ -429,21 +415,14 @@ async function renderPageClientSide(renderArgs) {
429
415
  */
430
416
  // onHydrationEnd()
431
417
  if (isFirstRender && !onRenderClientError) {
432
- assertHook(pageContext, 'onHydrationEnd');
433
- const hook = getHookFromPageContext(pageContext, 'onHydrationEnd');
434
- if (hook) {
435
- const { hookFn } = hook;
436
- try {
437
- await executeHook(() => hookFn(pageContext), hook, pageContext);
438
- }
439
- catch (err) {
440
- await onError(err);
441
- if (!isErrorPage)
442
- return;
443
- }
444
- if (isRenderOutdated(true))
418
+ const res = await execHookErrorHandling('onHydrationEnd', pageContext, preparePageContextForPublicUsageClient);
419
+ if ('err' in res) {
420
+ await onError(res.err);
421
+ if (!isErrorPage)
445
422
  return;
446
423
  }
424
+ if (isRenderOutdated(true))
425
+ return;
447
426
  }
448
427
  // We purposely abort *after* onHydrationEnd() is called (see comment above).
449
428
  if (isRenderOutdated(true))
@@ -452,21 +431,15 @@ async function renderPageClientSide(renderArgs) {
452
431
  if (globalObject.isTransitioning) {
453
432
  globalObject.isTransitioning = undefined;
454
433
  assert(previousPageContext);
455
- assertHook(previousPageContext, 'onPageTransitionEnd');
456
- const hook = getHookFromPageContext(previousPageContext, 'onPageTransitionEnd');
457
- if (hook) {
458
- const { hookFn } = hook;
459
- try {
460
- await executeHook(() => hookFn(pageContext), hook, pageContext);
461
- }
462
- catch (err) {
463
- await onError(err);
464
- if (!isErrorPage)
465
- return;
466
- }
467
- if (isRenderOutdated(true))
434
+ const hooks = getHookFromPageContextNew('onPageTransitionEnd', previousPageContext);
435
+ const res = await execHooksErrorHandling(hooks, pageContext, preparePageContextForPublicUsageClient);
436
+ if ('err' in res) {
437
+ await onError(res.err);
438
+ if (!isErrorPage)
468
439
  return;
469
440
  }
441
+ if (isRenderOutdated(true))
442
+ return;
470
443
  }
471
444
  if (!scrollTarget && previousPageContext) {
472
445
  const keepScrollPositionPrev = getKeepScrollPositionSetting(previousPageContext);
@@ -489,6 +462,34 @@ async function renderPageClientSide(renderArgs) {
489
462
  stampFinished(urlOriginal);
490
463
  }
491
464
  }
465
+ async function getPageContextBegin(isForErrorPage, { urlOriginal, isBackwardNavigation, pageContextsFromRewrite, isClientSideNavigation, pageContextInitClient, isFirstRender }) {
466
+ const previousPageContext = globalObject.previousPageContext ?? null;
467
+ const pageContext = await createPageContextClientSide(urlOriginal);
468
+ objectAssign(pageContext, {
469
+ isBackwardNavigation,
470
+ isClientSideNavigation,
471
+ isHydration: isFirstRender && !isForErrorPage,
472
+ previousPageContext,
473
+ ...pageContextInitClient
474
+ });
475
+ // TODO/next-major-release: remove
476
+ Object.defineProperty(pageContext, '_previousPageContext', {
477
+ get() {
478
+ assertWarning(false, 'pageContext._previousPageContext has been renamed pageContext.previousPageContext', {
479
+ showStackTrace: true,
480
+ onlyOnce: true
481
+ });
482
+ return previousPageContext;
483
+ },
484
+ enumerable: false
485
+ });
486
+ {
487
+ const pageContextFromAllRewrites = getPageContextFromAllRewrites(pageContextsFromRewrite);
488
+ assert(!('urlOriginal' in pageContextFromAllRewrites));
489
+ objectAssign(pageContext, pageContextFromAllRewrites);
490
+ }
491
+ return pageContext;
492
+ }
492
493
  // For Vike tests (but also potentially for Vike users)
493
494
  // https://github.com/vikejs/vike/blob/ffbc5cf16407bcc075f414447e50d997c87c0c94/test/playground/pages/nested-layout/e2e-test.ts#L59
494
495
  function stampFinished(urlOriginal) {