vike 0.4.171 → 0.4.172

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 (199) hide show
  1. package/dist/cjs/node/plugin/plugins/buildConfig.js +3 -4
  2. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  3. package/dist/cjs/node/plugin/plugins/devConfig/index.js +2 -1
  4. package/dist/cjs/node/plugin/plugins/envVars.js +2 -1
  5. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  6. package/dist/cjs/node/plugin/plugins/importUserCode/{generateEagerImport.js → addImportStatement.js} +8 -10
  7. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +0 -1
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +31 -75
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -43
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +9 -50
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  14. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +17 -2
  15. package/dist/cjs/node/prerender/runPrerender.js +35 -15
  16. package/dist/cjs/node/prerender/utils.js +1 -0
  17. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +3 -3
  18. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScripts.js +2 -1
  19. package/dist/cjs/node/runtime/html/injectAssets/mergeScriptTags.js +2 -8
  20. package/dist/cjs/node/runtime/html/renderHtml.js +19 -20
  21. package/dist/cjs/node/runtime/html/stream.js +9 -9
  22. package/dist/cjs/node/runtime/renderPage/analyzePage.js +9 -7
  23. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +1 -1
  24. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +2 -2
  25. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -8
  26. package/dist/cjs/node/runtime/renderPage/getHttpResponseBody.js +2 -2
  27. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  28. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +91 -282
  29. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  30. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +30 -10
  31. package/dist/cjs/node/runtime/renderPage.js +17 -13
  32. package/dist/cjs/node/runtime/utils.js +2 -0
  33. package/dist/cjs/node/shared/assertV1Design.js +3 -4
  34. package/dist/cjs/shared/getPageContext.js +5 -0
  35. package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  36. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +2 -2
  37. package/dist/cjs/shared/getPageFiles/getExports.js +49 -1
  38. package/dist/cjs/shared/getPageFiles/parseGlobResults.js +15 -8
  39. package/dist/cjs/shared/hooks/executeHook.js +22 -3
  40. package/dist/cjs/shared/hooks/getHook.js +2 -2
  41. package/dist/cjs/shared/page-configs/getConfigValue.js +14 -17
  42. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +70 -0
  43. package/dist/cjs/shared/page-configs/loadConfigValues.js +3 -12
  44. package/dist/cjs/shared/page-configs/serialize/assertPageConfigsSerialized.js +0 -18
  45. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +110 -16
  46. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +198 -0
  47. package/dist/cjs/shared/route/executeGuardHook.js +1 -1
  48. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +1 -1
  49. package/dist/cjs/shared/route/index.js +2 -2
  50. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  51. package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
  52. package/dist/cjs/shared/sortPageContext.js +4 -8
  53. package/dist/cjs/shared/utils.js +2 -0
  54. package/dist/cjs/utils/assert.js +1 -1
  55. package/dist/cjs/utils/assertNodeVersion.js +1 -1
  56. package/dist/cjs/utils/changeEnumerable.js +9 -0
  57. package/dist/cjs/utils/escapeHtml.js +14 -0
  58. package/dist/cjs/utils/getPropAccessNotation.js +1 -4
  59. package/dist/cjs/utils/hasProp.js +5 -7
  60. package/dist/cjs/utils/normalizeHeaders.js +13 -0
  61. package/dist/cjs/utils/objectAssign.js +1 -1
  62. package/dist/cjs/utils/objectDefineProperty.js +8 -0
  63. package/dist/cjs/utils/objectKeys.js +8 -4
  64. package/dist/cjs/utils/projectInfo.js +1 -1
  65. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +6 -4
  66. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  67. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +16 -12
  68. package/dist/esm/client/client-routing-runtime/installClientRouter.js +18 -10
  69. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +3 -3
  70. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +4 -4
  71. package/dist/esm/client/server-routing-runtime/utils.d.ts +1 -0
  72. package/dist/esm/client/server-routing-runtime/utils.js +1 -0
  73. package/dist/esm/client/shared/executeOnRenderClientHook.js +1 -1
  74. package/dist/esm/client/shared/getPageContextProxyForUser.d.ts +3 -2
  75. package/dist/esm/client/shared/getPageContextProxyForUser.js +35 -48
  76. package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
  77. package/dist/esm/node/plugin/plugins/buildConfig.js +3 -4
  78. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  79. package/dist/esm/node/plugin/plugins/devConfig/index.js +2 -1
  80. package/dist/esm/node/plugin/plugins/envVars.js +2 -1
  81. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  82. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.d.ts +14 -0
  83. package/dist/esm/node/plugin/plugins/importUserCode/{generateEagerImport.js → addImportStatement.js} +7 -9
  84. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +0 -1
  85. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -1
  86. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  87. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  88. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +31 -75
  89. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -43
  90. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +9 -50
  91. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.d.ts +1 -0
  92. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  93. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +14 -2
  94. package/dist/esm/node/prerender/runPrerender.js +37 -17
  95. package/dist/esm/node/prerender/utils.d.ts +1 -0
  96. package/dist/esm/node/prerender/utils.js +1 -0
  97. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +3 -3
  98. package/dist/esm/node/runtime/html/injectAssets/getViteDevScripts.js +3 -2
  99. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.d.ts +1 -1
  100. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.js +2 -8
  101. package/dist/esm/node/runtime/html/renderHtml.js +19 -20
  102. package/dist/esm/node/runtime/html/stream.d.ts +1 -1
  103. package/dist/esm/node/runtime/html/stream.js +9 -9
  104. package/dist/esm/node/runtime/renderPage/analyzePage.js +9 -7
  105. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +2 -2
  106. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +2 -2
  107. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -8
  108. package/dist/esm/node/runtime/renderPage/getHttpResponseBody.js +2 -2
  109. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -6
  110. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  111. package/dist/esm/node/runtime/renderPage/logErrorHint.d.ts +2 -6
  112. package/dist/esm/node/runtime/renderPage/logErrorHint.js +92 -283
  113. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  114. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  115. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +65 -39
  116. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +31 -11
  117. package/dist/esm/node/runtime/renderPage.js +17 -13
  118. package/dist/esm/node/runtime/utils.d.ts +2 -0
  119. package/dist/esm/node/runtime/utils.js +2 -0
  120. package/dist/esm/node/shared/assertV1Design.d.ts +2 -2
  121. package/dist/esm/node/shared/assertV1Design.js +3 -4
  122. package/dist/esm/shared/VikeNamespace.d.ts +9 -0
  123. package/dist/esm/shared/getPageContext.d.ts +1 -0
  124. package/dist/esm/shared/getPageContext.js +1 -0
  125. package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
  126. package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  127. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +3 -3
  128. package/dist/esm/shared/getPageFiles/getExports.d.ts +36 -0
  129. package/dist/esm/shared/getPageFiles/getExports.js +50 -2
  130. package/dist/esm/shared/getPageFiles/parseGlobResults.js +14 -7
  131. package/dist/esm/shared/hooks/executeHook.d.ts +10 -1
  132. package/dist/esm/shared/hooks/executeHook.js +21 -2
  133. package/dist/esm/shared/hooks/getHook.d.ts +2 -2
  134. package/dist/esm/shared/hooks/getHook.js +3 -3
  135. package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +2 -2
  136. package/dist/esm/shared/page-configs/PageConfig.d.ts +14 -8
  137. package/dist/esm/shared/page-configs/getConfigValue.d.ts +12 -12
  138. package/dist/esm/shared/page-configs/getConfigValue.js +13 -16
  139. package/dist/esm/shared/page-configs/getConfigValueBuildTime.d.ts +9 -0
  140. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +67 -0
  141. package/dist/esm/shared/page-configs/loadConfigValues.js +3 -12
  142. package/dist/esm/shared/page-configs/serialize/PageConfigSerialized.d.ts +17 -21
  143. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.d.ts +1 -5
  144. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.js +1 -16
  145. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +4 -1
  146. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +109 -15
  147. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +5 -0
  148. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +192 -0
  149. package/dist/esm/shared/route/executeGuardHook.js +1 -1
  150. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +1 -1
  151. package/dist/esm/shared/route/index.d.ts +3 -3
  152. package/dist/esm/shared/route/index.js +2 -2
  153. package/dist/esm/shared/route/loadPageRoutes.js +3 -3
  154. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  155. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  156. package/dist/esm/shared/sortPageContext.js +4 -8
  157. package/dist/esm/shared/types.d.ts +32 -6
  158. package/dist/esm/shared/utils.d.ts +2 -0
  159. package/dist/esm/shared/utils.js +2 -0
  160. package/dist/esm/types/index.d.ts +1 -1
  161. package/dist/esm/utils/assert.js +1 -1
  162. package/dist/esm/utils/assertNodeVersion.js +1 -1
  163. package/dist/esm/utils/changeEnumerable.d.ts +2 -0
  164. package/dist/esm/utils/changeEnumerable.js +5 -0
  165. package/dist/esm/utils/escapeHtml.d.ts +1 -0
  166. package/dist/esm/utils/escapeHtml.js +10 -0
  167. package/dist/esm/utils/getPropAccessNotation.d.ts +1 -2
  168. package/dist/esm/utils/getPropAccessNotation.js +2 -6
  169. package/dist/esm/utils/hasProp.d.ts +4 -13
  170. package/dist/esm/utils/hasProp.js +5 -7
  171. package/dist/esm/utils/normalizeHeaders.d.ts +1 -0
  172. package/dist/esm/utils/normalizeHeaders.js +9 -0
  173. package/dist/esm/utils/objectAssign.js +1 -1
  174. package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
  175. package/dist/esm/utils/objectDefineProperty.js +4 -0
  176. package/dist/esm/utils/objectKeys.d.ts +1 -3
  177. package/dist/esm/utils/objectKeys.js +8 -4
  178. package/dist/esm/utils/projectInfo.d.ts +2 -2
  179. package/dist/esm/utils/projectInfo.js +1 -1
  180. package/package.json +21 -12
  181. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -76
  182. package/dist/cjs/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -14
  183. package/dist/cjs/node/shared/getClientEntry.js +0 -12
  184. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +0 -85
  185. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -24
  186. package/dist/cjs/shared/page-configs/serialize/serializeConfigValue.js +0 -50
  187. package/dist/esm/node/plugin/plugins/importUserCode/generateEagerImport.d.ts +0 -16
  188. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +0 -5
  189. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -70
  190. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.d.ts +0 -5
  191. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -11
  192. package/dist/esm/node/shared/getClientEntry.d.ts +0 -3
  193. package/dist/esm/node/shared/getClientEntry.js +0 -9
  194. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.d.ts +0 -4
  195. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +0 -82
  196. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.d.ts +0 -4
  197. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -21
  198. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.d.ts +0 -8
  199. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.js +0 -47
@@ -51,7 +51,7 @@ async function renderPageClientSide(renderArgs) {
51
51
  const hook = onPageTransitionStartHook;
52
52
  const { hookFn } = hook;
53
53
  try {
54
- await executeHook(() => hookFn(pageContext), hook);
54
+ await executeHook(() => hookFn(pageContext), hook, pageContext);
55
55
  }
56
56
  catch (err) {
57
57
  await onError(err);
@@ -353,7 +353,7 @@ async function renderPageClientSide(renderArgs) {
353
353
  if (hook) {
354
354
  const { hookFn } = hook;
355
355
  try {
356
- await executeHook(() => hookFn(pageContext), hook);
356
+ await executeHook(() => hookFn(pageContext), hook, pageContext);
357
357
  }
358
358
  catch (err) {
359
359
  await onError(err);
@@ -377,7 +377,7 @@ async function renderPageClientSide(renderArgs) {
377
377
  if (hook) {
378
378
  const { hookFn } = hook;
379
379
  try {
380
- await executeHook(() => hookFn(pageContext), hook);
380
+ await executeHook(() => hookFn(pageContext), hook, pageContext);
381
381
  }
382
382
  catch (err) {
383
383
  await onError(err);
@@ -8,8 +8,8 @@ declare function getPageContext(): Promise<{
8
8
  _hasPageContextFromServer: true;
9
9
  _hasPageContextFromClient: false;
10
10
  } & {
11
- _pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
12
- _pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
13
- } & import("../../shared/getPageFiles/getExports.js").PageContextExports & {
14
- _pageFilesLoaded: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
11
+ _pageFilesAll: import("../../shared/getPageFiles.js").PageFile[];
12
+ _pageConfigs: import("../../__internal/index.js").PageConfig[];
13
+ } & import("../../shared/getPageFiles.js").PageContextExports & {
14
+ _pageFilesLoaded: import("../../shared/getPageFiles.js").PageFile[];
15
15
  }>;
@@ -12,3 +12,4 @@ export * from '../../utils/parseUrl.js';
12
12
  export * from '../../utils/projectInfo.js';
13
13
  export * from '../../utils/slice.js';
14
14
  export * from '../../utils/unique.js';
15
+ export * from '../../utils/getPropAccessNotation.js';
@@ -16,3 +16,4 @@ export * from '../../utils/parseUrl.js';
16
16
  export * from '../../utils/projectInfo.js';
17
17
  export * from '../../utils/slice.js';
18
18
  export * from '../../utils/unique.js'; // Only used by Server Routing (not needed for Client Routing)
19
+ export * from '../../utils/getPropAccessNotation.js';
@@ -45,7 +45,7 @@ async function executeOnRenderClientHook(pageContext, isClientRouting) {
45
45
  const renderHook = hook.hookFn;
46
46
  assert(hookName);
47
47
  // We don't use a try-catch wrapper because rendering errors are usually handled by the UI framework. (E.g. React's Error Boundaries.)
48
- const hookResult = await executeHook(() => renderHook(pageContextForUserConsumption), hook);
48
+ const hookResult = await executeHook(() => renderHook(pageContextForUserConsumption), hook, pageContext);
49
49
  assertUsage(hookResult === undefined, `The ${hookName}() hook defined by ${hook.hookFilePath} isn't allowed to return a value`);
50
50
  }
51
51
  function getUrlToShowToUser(pageContext) {
@@ -5,7 +5,8 @@ type PageContextForPassToClientWarning = {
5
5
  _hasPageContextFromClient: boolean;
6
6
  };
7
7
  /**
8
- * - Throw error when pageContext value isn't serializable
9
- * - Throw error when pageContext prop is missing in passToClient
8
+ * Throw error when pageContext value isn't:
9
+ * - serializable, or
10
+ * - defined.
10
11
  */
11
12
  declare function getPageContextProxyForUser<PageContext extends Record<string, unknown> & PageContextForPassToClientWarning>(pageContext: PageContext): PageContext;
@@ -1,10 +1,11 @@
1
1
  export { getPageContextProxyForUser };
2
- import { assert, assertUsage, assertWarning, getGlobalObject } from '../server-routing-runtime/utils.js';
2
+ import { assert, assertUsage, assertWarning, getGlobalObject, getPropAccessNotation } from '../server-routing-runtime/utils.js';
3
3
  import { notSerializable } from '../../shared/notSerializable.js';
4
4
  const globalObject = getGlobalObject('getPageContextProxyForUser.ts', {});
5
5
  /**
6
- * - Throw error when pageContext value isn't serializable
7
- * - Throw error when pageContext prop is missing in passToClient
6
+ * Throw error when pageContext value isn't:
7
+ * - serializable, or
8
+ * - defined.
8
9
  */
9
10
  function getPageContextProxyForUser(pageContext) {
10
11
  assert([true, false].includes(pageContext._hasPageContextFromServer));
@@ -12,66 +13,45 @@ function getPageContextProxyForUser(pageContext) {
12
13
  return new Proxy(pageContext, {
13
14
  get(_, prop) {
14
15
  const val = pageContext[prop];
15
- const propName = JSON.stringify(prop);
16
- assertUsage(val !== notSerializable, `pageContext[${propName}] couldn't be serialized and, therefore, is missing on the client-side. Check the server logs for more information.`);
17
- assertIsDefined(pageContext, prop);
16
+ const propName = getPropAccessNotation(prop);
17
+ assertUsage(val !== notSerializable, `pageContext${propName} couldn't be serialized and, therefore, is missing on the client-side. Check the server logs for more information.`);
18
+ passToClientHint(pageContext, prop, propName);
18
19
  return val;
19
20
  }
20
21
  });
21
22
  }
22
- function assertIsDefined(pageContext, prop) {
23
- // We disable assertIsDefined() for the next attempt to read `prop`, because of how Vue's reactivity work. When changing a reactive object:
24
- // - Vue tries to read its old value first. This triggers a `assertIsDefined()` failure if e.g. `pageContextOldReactive.routeParams = pageContextNew.routeParams` and `pageContextOldReactive` has no `routeParams`.
25
- // - Vue seems to read __v_raw before reading the property
26
- if (globalObject.prev === prop || globalObject.prev === '__v_raw')
23
+ function passToClientHint(pageContext, prop, propName) {
24
+ if (handleVueReactivity(prop))
27
25
  return;
28
- ignoreNextRead(prop);
26
+ // `prop in pageContext` is the trick we use to know the passToClient value on the client-side, as we set a value to all passToClient props, even `undefined` ones:
27
+ // ```html
28
+ // <script id="vike_pageContext" type="application/json">{"pageProps":"!undefined"}</script>
29
+ // ```
29
30
  if (prop in pageContext)
30
31
  return;
31
- if (isExpected(prop))
32
+ if (isWhitelisted(prop))
32
33
  return;
33
- // - If no pageContext was fetchd from the server, then adding props to passToClient is useless.
34
- // - Showing a warning, even though no pageContext was fetched from the server, is actually erroneous as the client runtime cannot deduce the passToClient list.
34
+ // The trick described above (`prop in pageContext`) doesn't work if Vike doesn't fetch any pageContext from the server.
35
+ // - There would still be some value to show a warning, but it isn't worth it because of the confusion that the first recommendation (adding `prop` to `passToClient`) wouldn't actually remove the warning, and only the second recommendation (using `prop in pageContext` instead of `pageContext[prop]`) would work.
35
36
  if (!pageContext._hasPageContextFromServer)
36
37
  return;
37
- const propName = JSON.stringify(prop);
38
- /* This handling would be the clearest but, unfortunately, it's fundamentally problematic:
39
- * - It would force the pageContext value consumer to be synchronized with the pageContext value provider. For example, if vike-react wants to conditionally do something dependening on wehther some optional pageContext value was provided by some optional vike-react-* integration package.
40
- * - If a pageContext value is set by an optional hook, then it's expected that the value is undefined if the hook doesn't exist.
41
- const errMsg = `pageContext[${propName}] is \`undefined\` on the client-side. If it's defined on the server-side then add ${propName} to passToClient (https://vike.dev/passToClient), otherwise make sure your client-side hooks always define it (e.g. set it to \`null\` instead of \`undefined\`).`
42
- assertUsage(false, errMsg)
43
- */
44
- if (!pageContext._hasPageContextFromClient) {
45
- // We can safely assume that the property is missing in passToClient, because the server-side defines all passToClient properties even if they have an undefined value:
46
- // ```
47
- // <script id="vike_pageContext" type="application/json">{"_pageId":"/pages/admin","user":"!undefined","pageProps":"!undefined","title":"!undefined","abortReason":"!undefined","_urlRewrite":null}</script>
48
- // ```
49
- // Note how properties have "!undefined" values => we can tell whether an undefined pageContext value exists in passToClient.
50
- assertUsage(false, `pageContext[${propName}] isn't available on the client-side because ${propName} is missing in passToClient, see https://vike.dev/passToClient`);
38
+ const errMsg = `pageContext${propName} isn't defined on the client-side, see https://vike.dev/passToClient#error`;
39
+ if (
40
+ // TODO/next-major-release always make it an error.
41
+ // - Remove pageContext._hasPageContextFromClient logic (IIRC this is its only use case).
42
+ pageContext._hasPageContextFromClient) {
43
+ assertWarning(false, errMsg, { onlyOnce: false, showStackTrace: true });
51
44
  }
52
45
  else {
53
- // Do nothing, not even a warning, because we don't know whether the user expects that the pageContext value can be undefined. (E.g. a pageContext value that is defined by an optional hook.)
54
- // TODO/next-major-release make it an assertUsage()
55
- assertWarning(false, [
56
- `pageContext[${propName}] isn't defined on the client-side:`,
57
- `1. if it's defined by the server-side then add ${propName} to passToClient (https://vike.dev/passToClient), or`,
58
- `2. if it's expected that it may not be defined:`,
59
- ' ```js',
60
- ' // ❌ Replace code like this:',
61
- ` const val = pageContext[${propName}] ?? someDefaultValue`,
62
- ' // ✅ With that:',
63
- ` const val = ${propName} in pageContext ? pageContext[${propName}] : someDefaultValue`,
64
- ' ```',
65
- `See stack track below to find where pageContext[${propName}] is being accessed.`
66
- ].join('\n'), { showStackTrace: true, onlyOnce: false });
46
+ assertUsage(false, errMsg);
67
47
  }
68
48
  }
69
- const IGNORE_LIST = [
49
+ const WHITELIST = [
70
50
  'then',
71
- 'toJSON' // Vue tries to get `toJSON`
51
+ 'toJSON' // Vue triggers `toJSON`
72
52
  ];
73
- function isExpected(prop) {
74
- if (IGNORE_LIST.includes(prop))
53
+ function isWhitelisted(prop) {
54
+ if (WHITELIST.includes(prop))
75
55
  return true;
76
56
  if (typeof prop === 'symbol')
77
57
  return true; // Vue tries to access some symbols
@@ -81,9 +61,16 @@ function isExpected(prop) {
81
61
  return true; // Vue internals upon `reactive(pageContext)`
82
62
  return false;
83
63
  }
84
- function ignoreNextRead(prop) {
64
+ // Handle Vue's reactivity.
65
+ // When changing a reactive object:
66
+ // - Vue tries to read its old value first. This triggers a `assertIsDefined()` failure if e.g. `pageContextReactive.routeParams = pageContextNew.routeParams` and `pageContextReactive` has no `routeParams`.
67
+ // - Vue seems to read __v_raw before reading the property.
68
+ function handleVueReactivity(prop) {
69
+ if (globalObject.prev === prop || globalObject.prev === '__v_raw')
70
+ return true;
85
71
  globalObject.prev = prop;
86
72
  window.setTimeout(() => {
87
73
  globalObject.prev = undefined;
88
74
  }, 0);
75
+ return false;
89
76
  }
@@ -3,6 +3,7 @@ export { isErrorFetchingStaticAssets };
3
3
  import { getPageFilesClientSide, getPageContextExports } from '../../shared/getPageFiles.js';
4
4
  import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
5
5
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
6
+ import { objectAssign } from '../server-routing-runtime/utils.js';
6
7
  const stamp = '__whileFetchingAssets';
7
8
  async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
8
9
  const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
@@ -29,10 +30,9 @@ async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
29
30
  throw err;
30
31
  }
31
32
  const pageContextExports = getPageContextExports(pageFilesClientSide, pageConfigLoaded);
32
- const pageContextAddendum = {
33
- ...pageContextExports,
34
- _pageFilesLoaded: pageFilesClientSide
35
- };
33
+ const pageContextAddendum = {};
34
+ objectAssign(pageContextAddendum, pageContextExports);
35
+ objectAssign(pageContextAddendum, { _pageFilesLoaded: pageFilesClientSide });
36
36
  return pageContextAddendum;
37
37
  }
38
38
  function isErrorFetchingStaticAssets(err) {
@@ -4,19 +4,18 @@ export { analyzeClientEntries };
4
4
  export { manifestTempFile };
5
5
  import { assert, resolveOutDir, viteIsSSR, addOnBeforeLogHook, removeFileExtention, unique, assertUsage, injectRollupInputs, normalizeRollupInput, getOutDirs, assertNodeEnv_build, assertIsNpmPackageImport } from '../utils.js';
6
6
  import { getVikeConfig, isV1Design } from './importUserCode/v1-design/getVikeConfig.js';
7
- import { getConfigValue } from '../../../shared/page-configs/getConfigValue.js';
8
7
  import { findPageFiles } from '../shared/findPageFiles.js';
9
8
  import { getConfigVike } from '../../shared/getConfigVike.js';
10
9
  import { getVirtualFileIdPageConfigValuesAll } from '../../shared/virtual-files/virtualFilePageConfigValuesAll.js';
11
10
  import { extractAssetsAddQuery } from '../../shared/extractAssetsQuery.js';
12
11
  import { createRequire } from 'module';
13
- import { getClientEntry } from '../../shared/getClientEntry.js';
14
12
  import fs from 'fs/promises';
15
13
  import path from 'path';
16
14
  import { fixServerAssets, fixServerAssets_isEnabled } from './buildConfig/fixServerAssets.js';
17
15
  import { set_constant_ASSETS_MAP } from './importBuild/index.js';
18
16
  import { prependEntriesDir } from '../../shared/prependEntriesDir.js';
19
17
  import { getFilePathResolved } from '../shared/getFilePath.js';
18
+ import { getConfigValueBuildTime } from '../../../shared/page-configs/getConfigValueBuildTime.js';
20
19
  // @ts-ignore Shimmed by dist-cjs-fixup.js for CJS build.
21
20
  const importMetaUrl = import.meta.url;
22
21
  const require_ = createRequire(importMetaUrl);
@@ -152,7 +151,7 @@ function analyzeClientEntries(pageConfigs, config) {
152
151
  let clientEntries = {};
153
152
  let clientEntryList = [];
154
153
  pageConfigs.forEach((pageConfig) => {
155
- const configValue = getConfigValue(pageConfig, 'clientRouting', 'boolean');
154
+ const configValue = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
156
155
  if (configValue?.value) {
157
156
  hasClientRouting = true;
158
157
  }
@@ -165,7 +164,7 @@ function analyzeClientEntries(pageConfigs, config) {
165
164
  clientEntries[entryName] = entryTarget;
166
165
  }
167
166
  {
168
- const clientEntry = getClientEntry(pageConfig);
167
+ const clientEntry = getConfigValueBuildTime(pageConfig, 'client', 'string')?.value ?? null;
169
168
  if (clientEntry) {
170
169
  clientEntryList.push(clientEntry);
171
170
  }
@@ -2,7 +2,6 @@ export { determineOptimizeDeps };
2
2
  import { findPageFiles } from '../../shared/findPageFiles.js';
3
3
  import { assert, assertIsNpmPackageImport, createDebugger, isArray, unique } from '../../utils.js';
4
4
  import { getVikeConfig } from '../importUserCode/v1-design/getVikeConfig.js';
5
- import { getConfigValueSourcesNotOverriden } from '../../shared/getConfigValueSourcesNotOverriden.js';
6
5
  import { analyzeClientEntries } from '../buildConfig.js';
7
6
  import { virtualFileIdImportUserCodeClientCR, virtualFileIdImportUserCodeClientSR } from '../../../shared/virtual-files/virtualFileImportUserCode.js';
8
7
  import { getFilePathResolved } from '../../shared/getFilePath.js';
@@ -45,20 +44,24 @@ async function getPageDeps(config, pageConfigs, isDev) {
45
44
  // V1 design
46
45
  {
47
46
  pageConfigs.forEach((pageConfig) => {
48
- getConfigValueSourcesNotOverriden(pageConfig).forEach((configValueSource) => {
49
- if (!configValueSource.valueIsImportedAtRuntime)
50
- return;
51
- const { definedAtFilePath, configEnv } = configValueSource;
52
- if (!configEnv.client)
53
- return;
54
- if (definedAtFilePath.filePathAbsoluteUserRootDir !== null) {
55
- // Vite expects entries to be filesystem absolute paths (surprisingly so).
56
- addEntry(definedAtFilePath.filePathAbsoluteFilesystem);
57
- }
58
- else {
59
- // Adding definedAtFilePath.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
60
- addInclude(definedAtFilePath.importPathAbsolute);
61
- }
47
+ Object.values(pageConfig.configValueSources).forEach((sources) => {
48
+ sources
49
+ .filter((c) => !c.isOverriden)
50
+ .forEach((configValueSource) => {
51
+ if (!configValueSource.valueIsImportedAtRuntime)
52
+ return;
53
+ const { definedAtFilePath, configEnv } = configValueSource;
54
+ if (!configEnv.client)
55
+ return;
56
+ if (definedAtFilePath.filePathAbsoluteUserRootDir !== null) {
57
+ // Vite expects entries to be filesystem absolute paths (surprisingly so).
58
+ addEntry(definedAtFilePath.filePathAbsoluteFilesystem);
59
+ }
60
+ else {
61
+ // Adding definedAtFilePath.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
62
+ addInclude(definedAtFilePath.importPathAbsolute);
63
+ }
64
+ });
62
65
  });
63
66
  });
64
67
  }
@@ -73,7 +73,8 @@ function devConfig() {
73
73
  configureServer: {
74
74
  order: 'post',
75
75
  handler(server) {
76
- if (config.server.middlewareMode)
76
+ const hasHonoViteDevServer = !!config.plugins.find((p) => p.name === '@hono/vite-dev-server');
77
+ if (config.server.middlewareMode || hasHonoViteDevServer)
77
78
  return;
78
79
  return () => {
79
80
  addSsrMiddleware(server.middlewares);
@@ -50,7 +50,8 @@ function envVarsPlugin() {
50
50
  assertUsage(false, errMsg);
51
51
  }
52
52
  else {
53
- // Only a warning for faster development DX (e.g. when user toggles `ssr: boolean` or `onBeforeRenderIsomorph: boolean`)
53
+ // - Only a warning for faster development DX (e.g. when user toggles `ssr: boolean` or `onBeforeRenderIsomorph: boolean`).
54
+ // - But only showing a warning can be confusing: https://github.com/vikejs/vike/issues/1641
54
55
  assertWarning(false, errMsg, { onlyOnce: true });
55
56
  }
56
57
  }
@@ -101,7 +101,7 @@ function extractAssetsPlugin() {
101
101
  }
102
102
  // If the import path resolves to a file in `node_modules/`, we ignore that file:
103
103
  // - Direct CSS dependencies are included though, such as `import 'bootstrap/theme/dark.css'`. (Because the above if-branch for CSS files will add the file.)
104
- // - Loading CSS from a library (living in `node_modules/`) in a non-direct way is non-standard; we can safely not support this case. (I'm not aware of any library that does this.)
104
+ // - Loading CSS from a library (living in `node_modules/`) in a non-direct way is unconventional; we can safely not support this case. (I'm not aware of any library that does this.)
105
105
  assertPosixPath(file);
106
106
  if (file.includes('/node_modules/')) {
107
107
  return emptyModule(file, importer);
@@ -0,0 +1,14 @@
1
+ export { addImportStatement };
2
+ /**
3
+ * Naming:
4
+ * `import { someExport as someImport } from './some-file'`
5
+ * <=>
6
+ * `{`
7
+ * `importPath: './some-file',`
8
+ * `exportName: 'someExport',`
9
+ * `importName: 'someImport',`
10
+ * `}`
11
+ */
12
+ declare function addImportStatement(importStatements: string[], importPath: string, exportName: string): {
13
+ importName: string;
14
+ };
@@ -1,5 +1,4 @@
1
- export { generateEagerImport };
2
- let varCounterGlobal = 0;
1
+ export { addImportStatement };
3
2
  /**
4
3
  * Naming:
5
4
  * `import { someExport as someImport } from './some-file'`
@@ -9,14 +8,12 @@ let varCounterGlobal = 0;
9
8
  * `exportName: 'someExport',`
10
9
  * `importName: 'someImport',`
11
10
  * `}`
12
- * We discard the information that the import variable is called `someImport` because we don't need it.
13
11
  */
14
- function generateEagerImport(importPath, varCounter, exportName) {
15
- if (varCounter === undefined)
16
- varCounter = varCounterGlobal++;
17
- const importName = `import_${varCounter}`;
12
+ function addImportStatement(importStatements, importPath, exportName) {
13
+ const importCounter = importStatements.length + 1;
14
+ const importName = `import${importCounter}`;
18
15
  const importLiteral = (() => {
19
- if (!exportName || exportName === '*') {
16
+ if (exportName === '*') {
20
17
  return `* as ${importName}`;
21
18
  }
22
19
  if (exportName === 'default') {
@@ -25,5 +22,6 @@ function generateEagerImport(importPath, varCounter, exportName) {
25
22
  return `{ ${exportName} as ${importName} }`;
26
23
  })();
27
24
  const importStatement = `import ${importLiteral} from '${importPath}';`;
28
- return { importName, importStatement };
25
+ importStatements.push(importStatement);
26
+ return { importName };
29
27
  }
@@ -63,7 +63,6 @@ export const pageFilesExportNamesLazy = {};
63
63
  export const pageFilesExportNamesEager = {};
64
64
  export const pageFilesList = [];
65
65
  export const neverLoaded = {};
66
- export const isGeneratedFile = true;
67
66
 
68
67
  ${await getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRouting, config)}
69
68
 
@@ -56,7 +56,8 @@ type ConfigDefinitionInternal = Omit<ConfigDefinition, 'env'> & {
56
56
  _userEffectDefinedAtFilePath?: DefinedAtFilePath;
57
57
  env: ConfigEnvInternal;
58
58
  };
59
- type ConfigDefinitions = Record<string, ConfigDefinitionInternal>;
59
+ type ConfigDefinitions = Record<string, // configName
60
+ ConfigDefinitionInternal>;
60
61
  type ConfigDefinitionsBuiltIn = Record<ConfigNameBuiltIn, ConfigDefinitionInternal>;
61
62
  declare const configDefinitionsBuiltIn: ConfigDefinitionsBuiltIn;
62
63
  type ConfigNameGlobal = 'onPrerenderStart' | 'onBeforeRoute' | 'prerender' | 'disableAutoFullBuild' | 'includeAssetsImportedByServer' | 'baseAssets' | 'baseServer' | 'redirects' | 'trailingSlash' | 'disableUrlNormalization';
@@ -21,7 +21,7 @@ const configDefinitionsBuiltIn = {
21
21
  env: { server: true }
22
22
  },
23
23
  onBeforePrerenderStart: {
24
- env: { server: true }
24
+ env: { server: true, production: true }
25
25
  },
26
26
  Page: {
27
27
  env: { server: true, client: true }
@@ -47,7 +47,7 @@ const configDefinitionsBuiltIn = {
47
47
  },
48
48
  client: {
49
49
  // The value of the client config is merely the file path to the client entry file, which is only needed on the sever-side
50
- env: { server: true },
50
+ env: { server: true, config: true },
51
51
  _valueIsFilePath: true
52
52
  },
53
53
  clientRouting: {
@@ -95,7 +95,7 @@ const configDefinitionsBuiltIn = {
95
95
  };
96
96
  const configDefinitionsBuiltInGlobal = {
97
97
  onPrerenderStart: {
98
- env: { server: true }
98
+ env: { server: true, production: true }
99
99
  },
100
100
  onBeforeRoute: {
101
101
  env: { server: true, client: 'if-client-routing', eager: true }
@@ -10,7 +10,7 @@ import { parsePointerImportData } from './transformFileImports.js';
10
10
  import { getConfigFileExport } from '../getConfigFileExport.js';
11
11
  import { resolvePointerImport } from './resolvePointerImport.js';
12
12
  assertIsNotProductionRuntime();
13
- // Load fake import
13
+ // Load pointer import
14
14
  async function loadImportedFile(import_, userRootDir, importedFilesLoaded) {
15
15
  const f = import_.filePathAbsoluteFilesystem;
16
16
  if (!importedFilesLoaded[f]) {
@@ -30,7 +30,7 @@ async function loadValueFile(interfaceValueFile, configName, userRootDir) {
30
30
  interfaceValueFile.fileExportsByConfigName[configName_] = { configValue };
31
31
  });
32
32
  }
33
- // Load +config.js, including all its extends fake imports
33
+ // Load +config.js, including all its extends pointer imports
34
34
  async function loadConfigFile(configFilePath, userRootDir, visited, isExtensionConfig) {
35
35
  const { filePathAbsoluteFilesystem } = configFilePath;
36
36
  assertNoInfiniteLoop(visited, filePathAbsoluteFilesystem);