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
@@ -1,7 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.addSsrMiddleware = void 0;
4
7
  const renderPage_js_1 = require("../../runtime/renderPage.js");
8
+ const utils_js_1 = require("../utils.js");
9
+ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
5
10
  function addSsrMiddleware(middlewares) {
6
11
  middlewares.use(async (req, res, next) => {
7
12
  if (res.headersSent)
@@ -10,11 +15,21 @@ function addSsrMiddleware(middlewares) {
10
15
  if (!url)
11
16
  return next();
12
17
  const { headers } = req;
13
- const userAgent = headers['user-agent'];
14
18
  const pageContextInit = {
15
19
  urlOriginal: url,
16
- userAgent
20
+ headersOriginal: headers
17
21
  };
22
+ Object.defineProperty(pageContextInit, 'userAgent', {
23
+ get() {
24
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
25
+ (0, utils_js_1.assertWarning)(false, `${picocolors_1.default.cyan('pageContext.userAgent')} is deprecated: use ${picocolors_1.default.cyan("pageContext.headers['user-agent']")} instead.`, {
26
+ showStackTrace: true,
27
+ onlyOnce: true
28
+ });
29
+ return headers['user-agent'];
30
+ },
31
+ enumerable: false
32
+ });
18
33
  let pageContext;
19
34
  try {
20
35
  pageContext = await (0, renderPage_js_1.renderPage)(pageContextInit);
@@ -44,7 +44,7 @@ const helpers_js_1 = require("../../shared/page-configs/helpers.js");
44
44
  const getConfigValue_js_1 = require("../../shared/page-configs/getConfigValue.js");
45
45
  const loadConfigValues_js_1 = require("../../shared/page-configs/loadConfigValues.js");
46
46
  const error_page_js_1 = require("../../shared/error-page.js");
47
- const addUrlComputedProps_js_1 = require("../../shared/addUrlComputedProps.js");
47
+ const getPageContextUrlComputed_js_1 = require("../../shared/getPageContextUrlComputed.js");
48
48
  const abort_js_1 = require("../../shared/route/abort.js");
49
49
  const loadUserFilesServerSide_js_1 = require("../runtime/renderPage/loadUserFilesServerSide.js");
50
50
  const getHook_js_1 = require("../../shared/hooks/getHook.js");
@@ -52,6 +52,7 @@ const noRouteMatch_js_1 = require("../../shared/route/noRouteMatch.js");
52
52
  const getVikeConfig_js_1 = require("../plugin/plugins/importUserCode/v1-design/getVikeConfig.js");
53
53
  const logErrorHint_js_1 = require("../runtime/renderPage/logErrorHint.js");
54
54
  const executeHook_js_1 = require("../../shared/hooks/executeHook.js");
55
+ const getConfigValueBuildTime_js_1 = require("../../shared/page-configs/getConfigValueBuildTime.js");
55
56
  async function runPrerenderFromAPI(options = {}) {
56
57
  await runPrerender(options, 'prerender()');
57
58
  // - We purposely propagate the error to the user land, so that the error interrupts the user land. It's also, I guess, a nice-to-have that the user has control over the error.
@@ -142,7 +143,7 @@ async function collectDoNoPrerenderList(renderContext, pageConfigs, doNotPrerend
142
143
  // V1 design
143
144
  pageConfigs.forEach((pageConfig) => {
144
145
  const configName = 'prerender';
145
- const configValue = (0, getConfigValue_js_1.getConfigValue)(pageConfig, configName, 'boolean');
146
+ const configValue = (0, getConfigValueBuildTime_js_1.getConfigValueBuildTime)(pageConfig, configName, 'boolean');
146
147
  if (configValue?.value === false) {
147
148
  const configValueFilePathToShowToUser = (0, helpers_js_1.getConfigValueFilePathToShowToUser)(configValue.definedAtData);
148
149
  (0, utils_js_1.assert)(configValueFilePathToShowToUser);
@@ -245,7 +246,7 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
245
246
  if (doNotPrerenderList.find((p) => p.pageId === pageId)) {
246
247
  return;
247
248
  }
248
- const prerenderResult = await (0, executeHook_js_1.executeHook)(() => hookFn(), { hookName, hookFilePath, hookTimeout });
249
+ const prerenderResult = await (0, executeHook_js_1.executeHook)(() => hookFn(), { hookName, hookFilePath, hookTimeout }, null);
249
250
  const result = normalizeOnPrerenderHookResult(prerenderResult, hookFilePath, hookName);
250
251
  result.forEach(({ url, pageContext }) => {
251
252
  {
@@ -268,9 +269,9 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
268
269
  prerenderContext.pageContexts.push(pageContextNew);
269
270
  if (pageContext) {
270
271
  (0, utils_js_1.objectAssign)(pageContextNew, {
271
- _pageContextAlreadyProvidedByOnPrerenderHook: true,
272
- ...pageContext
272
+ _pageContextAlreadyProvidedByOnPrerenderHook: true
273
273
  });
274
+ (0, utils_js_1.objectAssign)(pageContextNew, pageContext);
274
275
  }
275
276
  });
276
277
  })));
@@ -328,14 +329,11 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
328
329
  _prerenderContext: prerenderContext
329
330
  };
330
331
  const pageContextInit = {
331
- urlOriginal,
332
- ...prerenderContext.pageContextInit
332
+ urlOriginal
333
333
  };
334
+ (0, utils_js_1.objectAssign)(pageContextInit, prerenderContext.pageContextInit);
334
335
  {
335
- const pageContextInitEnhanced = (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, renderContext, {
336
- // We set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in a onPrerenderStart() hook, e.g. /examples/i18n/
337
- urlComputedPropsNonEnumerable: true
338
- });
336
+ const pageContextInitEnhanced = (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, renderContext);
339
337
  (0, utils_js_1.objectAssign)(pageContext, pageContextInitEnhanced);
340
338
  }
341
339
  return pageContext;
@@ -410,6 +408,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
410
408
  pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
411
409
  });
412
410
  const docLink = 'https://vike.dev/i18n#pre-rendering';
411
+ // Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
412
+ const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
413
413
  let result = await (0, executeHook_js_1.executeHook)(() => hookFn({
414
414
  pageContexts: prerenderContext.pageContexts,
415
415
  // TODO/v1-release: remove warning
@@ -420,7 +420,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
420
420
  });
421
421
  return prerenderContext.pageContexts;
422
422
  }
423
- }), onPrerenderStartHook);
423
+ }), onPrerenderStartHook, null);
424
+ restoreEnumerable();
424
425
  if (result === null || result === undefined) {
425
426
  return;
426
427
  }
@@ -458,9 +459,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
458
459
  hookName
459
460
  };
460
461
  }
461
- // Restore as URL computed props are lost when user makes a pageContext copy
462
- (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContext);
463
462
  });
463
+ addPageContextComputedUrl(prerenderContext.pageContexts);
464
464
  }
465
465
  async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete) {
466
466
  const globalContext = (0, globalContext_js_1.getGlobalContext)();
@@ -502,7 +502,7 @@ async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete)
502
502
  if (pageContext._pageConfigs.length > 0) {
503
503
  const pageConfig = pageContext._pageConfigs.find((p) => p.pageId === pageId);
504
504
  (0, utils_js_1.assert)(pageConfig);
505
- usesClientRouter = (0, getConfigValue_js_1.getConfigValue)(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
505
+ usesClientRouter = (0, getConfigValue_js_1.getConfigValueRuntime)(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
506
506
  }
507
507
  else {
508
508
  usesClientRouter = globalContext.pluginManifest.usesClientRouter;
@@ -743,3 +743,23 @@ function assertIsNotAbort(err, urlOr404) {
743
743
  (0, utils_js_1.assert)(abortCall);
744
744
  (0, utils_js_1.assertUsage)(false, `${picocolors_1.default.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${picocolors_1.default.cyan(abortCaller)} isn't supported for pre-rendered pages`);
745
745
  }
746
+ function makePageContextComputedUrlNonEnumerable(pageContexts) {
747
+ change(false);
748
+ return { restoreEnumerable, addPageContextComputedUrl };
749
+ function restoreEnumerable() {
750
+ change(true);
751
+ }
752
+ function addPageContextComputedUrl(pageContexts) {
753
+ // Add URL computed props to the user-generated pageContext copies
754
+ pageContexts.forEach((pageContext) => {
755
+ const pageContextUrlComputed = (0, getPageContextUrlComputed_js_1.getPageContextUrlComputed)(pageContext);
756
+ (0, utils_js_1.objectAssign)(pageContext, pageContextUrlComputed);
757
+ });
758
+ }
759
+ function change(enumerable) {
760
+ pageContexts.forEach((pageContext) => {
761
+ (0, utils_js_1.changeEnumerable)(pageContext, 'urlPathname', enumerable);
762
+ (0, utils_js_1.changeEnumerable)(pageContext, 'urlParsed', enumerable);
763
+ });
764
+ }
765
+ }
@@ -31,3 +31,4 @@ __exportStar(require("../../utils/assertNodeEnv.js"), exports);
31
31
  __exportStar(require("../../utils/pLimit.js"), exports);
32
32
  __exportStar(require("../../utils/assertPathFilesystemAbsolute.js"), exports);
33
33
  __exportStar(require("../../utils/isArray.js"), exports);
34
+ __exportStar(require("../../utils/changeEnumerable.js"), exports);
@@ -112,7 +112,7 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
112
112
  });
113
113
  }
114
114
  // The JavaScript entry <script> tag
115
- const scriptEntry = await mergeScriptEntries(pageAssets, isProduction);
115
+ const scriptEntry = await mergeScriptEntries(pageAssets);
116
116
  if (scriptEntry) {
117
117
  htmlTags.push({
118
118
  htmlTag: scriptEntry,
@@ -134,11 +134,11 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
134
134
  return htmlTags;
135
135
  }
136
136
  exports.getHtmlTags = getHtmlTags;
137
- async function mergeScriptEntries(pageAssets, isProduction) {
137
+ async function mergeScriptEntries(pageAssets) {
138
138
  const scriptEntries = pageAssets.filter((pageAsset) => pageAsset.isEntry && pageAsset.assetType === 'script');
139
139
  const viteScripts = await (0, getViteDevScripts_js_1.getViteDevScripts)();
140
140
  const scriptTagsHtml = `${viteScripts}${scriptEntries.map((asset) => (0, inferHtmlTags_js_1.inferAssetTag)(asset)).join('')}`;
141
- const scriptTag = (0, mergeScriptTags_js_1.mergeScriptTags)(scriptTagsHtml, isProduction);
141
+ const scriptTag = (0, mergeScriptTags_js_1.mergeScriptTags)(scriptTagsHtml);
142
142
  return scriptTag;
143
143
  }
144
144
  function getPageContextJsonScriptTag(pageContext) {
@@ -21,7 +21,8 @@ async function getViteDevScripts() {
21
21
  (0, utils_js_1.assertUsage)(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), 'Vite plugins that minify the HTML are not supported by vike, see https://github.com/vikejs/vike/issues/224');
22
22
  (0, utils_js_1.assertUsage)(fakeHtml.startsWith(fakeHtmlBegin) && fakeHtml.endsWith(fakeHtmlEnd), 'You are using a Vite Plugin that transforms the HTML in a way that conflicts with vike. Create a new GitHub ticket to discuss a solution.');
23
23
  const viteInjection = fakeHtml.slice(fakeHtmlBegin.length, -1 * fakeHtmlEnd.length);
24
- (0, utils_js_1.assert)(viteInjection.includes('script'), { viteInjection });
24
+ (0, utils_js_1.assert)(viteInjection.includes('script'));
25
+ (0, utils_js_1.assertWarning)(!viteInjection.includes('import('), 'Unexpected Vite HMR code. Reach out to a Vike maintainer on GitHub.', { onlyOnce: true });
25
26
  const scriptTags = viteInjection;
26
27
  return scriptTags;
27
28
  }
@@ -6,7 +6,7 @@ const inferHtmlTags_js_1 = require("./inferHtmlTags.js");
6
6
  const scriptRE = /(<script\b(?:\s[^>]*>|>))(.*?)<\/script>/gims;
7
7
  const srcRE = /\bsrc\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
8
8
  const typeRE = /\btype\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
9
- function mergeScriptTags(scriptTagsHtml, isProduction) {
9
+ function mergeScriptTags(scriptTagsHtml) {
10
10
  let scriptTag = '';
11
11
  const scripts = parseScripts(scriptTagsHtml);
12
12
  // We need to merge module scripts to ensure execution order
@@ -21,13 +21,7 @@ function mergeScriptTags(scriptTagsHtml, isProduction) {
21
21
  const hasInnerHtml = !!innerHtml.trim();
22
22
  if (src) {
23
23
  (0, utils_js_1.assert)(!hasInnerHtml);
24
- if (isProduction) {
25
- contents.push(`import ${JSON.stringify(src)};`);
26
- }
27
- else {
28
- // Ensure HMR preamble code is executed before client entries
29
- contents.push(`import(${JSON.stringify(src)});`);
30
- }
24
+ contents.push(`import ${JSON.stringify(src)};`);
31
25
  }
32
26
  else if (hasInnerHtml) {
33
27
  innerHtml = innerHtml.split('\n').filter(Boolean).join('\n');
@@ -170,35 +170,44 @@ async function renderTemplate(templateContent, pageContext) {
170
170
  setStream(templateVar);
171
171
  continue;
172
172
  }
173
- const getErrMsg = (typeText, end) => {
173
+ const getErrMsg = (msg) => {
174
174
  const { hookName, hookFilePath } = pageContext._renderHook;
175
175
  const nth = (i === 0 && '1st') || (i === 1 && '2nd') || (i === 2 && '3rd') || `${i}-th`;
176
- return [`The ${nth} HTML variable is ${typeText}, see ${hookName}() hook defined by ${hookFilePath}.`, end]
176
+ return [
177
+ `The ${nth} HTML variable is ${msg}`,
178
+ `The HTML was provided by the ${hookName}() hook at ${hookFilePath}.`
179
+ ]
177
180
  .filter(Boolean)
178
181
  .join(' ');
179
182
  };
180
- (0, utils_js_1.assertUsage)(!(0, utils_js_1.isPromise)(templateVar), getErrMsg('a promise', `Did you forget to ${picocolors_1.default.cyan('await')} the promise?`));
183
+ (0, utils_js_1.assertUsage)(!(0, utils_js_1.isPromise)(templateVar), getErrMsg(`a promise, did you forget to ${picocolors_1.default.cyan('await')} the promise?`));
181
184
  if (templateVar === undefined || templateVar === null) {
182
- (0, utils_js_1.assertWarning)(false, getErrMsg(`${picocolors_1.default.cyan(String(templateVar))} which will be converted to an empty string`, `Pass the empty string ${picocolors_1.default.cyan("''")} instead of ${picocolors_1.default.cyan(String(templateVar))} to remove this warning.`), { onlyOnce: false });
185
+ const msgVal = picocolors_1.default.cyan(String(templateVar));
186
+ const msgEmptyString = picocolors_1.default.cyan("''");
187
+ const msg = `${msgVal} which will be converted to an empty string. Pass the empty string ${msgEmptyString} instead of ${msgVal} to remove this warning.`;
188
+ (0, utils_js_1.assertWarning)(false, getErrMsg(msg), { onlyOnce: false });
183
189
  templateVar = '';
184
190
  }
185
191
  {
186
192
  const varType = typeof templateVar;
187
- const streamNote = ['boolean', 'number', 'bigint', 'symbol'].includes(varType)
188
- ? null
189
- : '(See https://vike.dev/streaming for HTML streaming.)';
190
- (0, utils_js_1.assertUsage)(varType === 'string', getErrMsg(picocolors_1.default.cyan(`typeof htmlVar === "${varType}"`), streamNote));
193
+ if (varType !== 'string') {
194
+ const msgType = picocolors_1.default.cyan(`typeof htmlVariable === "${varType}"`);
195
+ const msg = `${msgType} but a string or stream (https://vike.dev/streaming) is expected instead.`;
196
+ (0, utils_js_1.assertUsage)(false, getErrMsg(msg));
197
+ }
191
198
  }
192
199
  {
193
200
  const { isProduction } = (0, globalContext_js_1.getGlobalContext)();
194
201
  if ((0, utils_js_1.isHtml)(templateVar) &&
195
202
  // We don't show this warning in production because it's expected that some users may (un)willingly do some XSS injection: we avoid flooding the production logs.
196
203
  !isProduction) {
197
- (0, utils_js_1.assertWarning)(false, getErrMsg(`${picocolors_1.default.cyan(templateVar)} which seems to be HTML code`, 'Did you forget to wrap the value with dangerouslySkipEscape()?'), { onlyOnce: false });
204
+ const msgVal = picocolors_1.default.cyan(String(templateVar));
205
+ const msg = `${msgVal} which seems to be HTML code. Did you forget to wrap the value with dangerouslySkipEscape()?`;
206
+ (0, utils_js_1.assertWarning)(false, getErrMsg(msg), { onlyOnce: false });
198
207
  }
199
208
  }
200
209
  // Escape untrusted template variable
201
- addHtmlPart(escapeHtml(templateVar));
210
+ addHtmlPart((0, utils_js_1.escapeHtml)(templateVar));
202
211
  }
203
212
  (0, utils_js_1.assert)(templateStrings.length === templateVariables.length + 1);
204
213
  addHtmlPart(templateStrings[templateStrings.length - 1]);
@@ -214,16 +223,6 @@ async function renderTemplate(templateContent, pageContext) {
214
223
  htmlPartsEnd
215
224
  };
216
225
  }
217
- function escapeHtml(unsafeString) {
218
- // Source: https://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript/6234804#6234804
219
- const safe = unsafeString
220
- .replace(/&/g, '&amp;')
221
- .replace(/</g, '&lt;')
222
- .replace(/>/g, '&gt;')
223
- .replace(/"/g, '&quot;')
224
- .replace(/'/g, '&#039;');
225
- return safe;
226
- }
227
226
  async function getHtmlString(htmlRender) {
228
227
  if (typeof htmlRender === 'string') {
229
228
  return htmlRender;
@@ -762,17 +762,17 @@ async function loadStreamNodeModule() {
762
762
  const { Readable, Writable } = streamModule;
763
763
  return { Readable, Writable };
764
764
  }
765
- function getStreamName(type, standard) {
766
- let standardName = (0, utils_js_1.capitalizeFirstLetter)(standard);
767
- if (standardName === 'Node') {
768
- standardName = 'Node.js';
765
+ function getStreamName(kind, type) {
766
+ let typeName = (0, utils_js_1.capitalizeFirstLetter)(type);
767
+ if (typeName === 'Node') {
768
+ typeName = 'Node.js';
769
769
  }
770
- const typeName = (0, utils_js_1.capitalizeFirstLetter)(type);
771
- if (type !== 'pipe') {
772
- return `a ${typeName} ${standardName} Stream`;
770
+ const kindName = (0, utils_js_1.capitalizeFirstLetter)(kind);
771
+ if (kind !== 'pipe') {
772
+ return `a ${kindName} ${typeName} Stream`;
773
773
  }
774
- if (type === 'pipe') {
775
- return `a ${standardName} Stream Pipe`;
774
+ if (kind === 'pipe') {
775
+ return `a ${typeName} Stream Pipe`;
776
776
  }
777
777
  (0, utils_js_1.assert)(false);
778
778
  }
@@ -6,12 +6,16 @@ const analyzePageClientSide_js_1 = require("../../../shared/getPageFiles/analyze
6
6
  const virtualFilePageConfigValuesAll_js_1 = require("../../shared/virtual-files/virtualFilePageConfigValuesAll.js");
7
7
  const analyzeClientSide_js_1 = require("../../../shared/getPageFiles/analyzeClientSide.js");
8
8
  const globalContext_js_1 = require("../globalContext.js");
9
- const getClientEntry_js_1 = require("../../shared/getClientEntry.js");
9
+ const getConfigValue_js_1 = require("../../../shared/page-configs/getConfigValue.js");
10
10
  function analyzePage(pageFilesAll, pageConfig, pageId) {
11
11
  if (pageConfig) {
12
12
  const { isClientSideRenderable, isClientRouting } = (0, analyzeClientSide_js_1.analyzeClientSide)(pageConfig, pageFilesAll, pageId);
13
- const clientFilePath = (0, getClientEntry_js_1.getClientEntry)(pageConfig);
14
- const clientEntry = !isClientSideRenderable ? clientFilePath : (0, determineClientEntry_js_1.getVikeClientEntry)(isClientRouting);
13
+ const clientEntries = [];
14
+ const clientFilePath = (0, getConfigValue_js_1.getConfigValueRuntime)(pageConfig, 'client', 'string')?.value ?? null;
15
+ if (clientFilePath)
16
+ clientEntries.push(clientFilePath);
17
+ if (isClientSideRenderable)
18
+ clientEntries.push((0, determineClientEntry_js_1.getVikeClientEntry)(isClientRouting));
15
19
  const clientDependencies = [];
16
20
  clientDependencies.push({
17
21
  id: (0, virtualFilePageConfigValuesAll_js_1.getVirtualFileIdPageConfigValuesAll)(pageConfig.pageId, true),
@@ -43,15 +47,13 @@ function analyzePage(pageFilesAll, pageConfig, pageId) {
43
47
  }
44
48
  })
45
49
  */
46
- const clientEntries = [];
47
- if (clientEntry) {
50
+ clientEntries.forEach((clientEntry) => {
48
51
  clientDependencies.push({
49
52
  id: clientEntry,
50
53
  onlyAssets: false,
51
54
  eagerlyImported: false
52
55
  });
53
- clientEntries.push(clientEntry);
54
- }
56
+ });
55
57
  return {
56
58
  isHtmlOnly: !isClientSideRenderable,
57
59
  isClientRouting,
@@ -9,7 +9,7 @@ function getCacheControl(pageId, pageConfigs) {
9
9
  if (pageConfigs.length === 0)
10
10
  return defaultValue;
11
11
  const pageConfig = (0, helpers_js_1.getPageConfig)(pageId, pageConfigs);
12
- const configValue = (0, getConfigValue_js_1.getConfigValue)(pageConfig, 'cacheControl', 'string');
12
+ const configValue = (0, getConfigValue_js_1.getConfigValueRuntime)(pageConfig, 'cacheControl', 'string');
13
13
  const value = configValue?.value;
14
14
  if (value)
15
15
  return value;
@@ -16,7 +16,7 @@ async function executeOnBeforeRenderAndDataHooks(pageContext) {
16
16
  }
17
17
  (0, preparePageContextForUserConsumptionServerSide_js_1.preparePageContextForUserConsumptionServerSide)(pageContext);
18
18
  if (dataHook) {
19
- const hookResult = await (0, executeHook_js_1.executeHook)(() => dataHook.hookFn(pageContext), dataHook);
19
+ const hookResult = await (0, executeHook_js_1.executeHook)(() => dataHook.hookFn(pageContext), dataHook, pageContext);
20
20
  // Note: hookResult can be anything (e.g. an object) and is to be assigned to pageContext.data
21
21
  const pageContextFromHook = {
22
22
  data: hookResult
@@ -24,7 +24,7 @@ async function executeOnBeforeRenderAndDataHooks(pageContext) {
24
24
  Object.assign(pageContext, pageContextFromHook);
25
25
  }
26
26
  if (onBeforeRenderHook) {
27
- const hookResult = await (0, executeHook_js_1.executeHook)(() => onBeforeRenderHook.hookFn(pageContext), onBeforeRenderHook);
27
+ const hookResult = await (0, executeHook_js_1.executeHook)(() => onBeforeRenderHook.hookFn(pageContext), onBeforeRenderHook, pageContext);
28
28
  (0, assertOnBeforeRenderHookReturn_js_1.assertOnBeforeRenderHookReturn)(hookResult, onBeforeRenderHook.hookFilePath);
29
29
  const pageContextFromHook = hookResult?.pageContext;
30
30
  Object.assign(pageContext, pageContextFromHook);
@@ -18,7 +18,7 @@ async function executeOnRenderHtmlHook(pageContext) {
18
18
  const { renderHook, hookFn } = getRenderHook(pageContext);
19
19
  (0, utils_js_1.objectAssign)(pageContext, { _renderHook: renderHook });
20
20
  (0, preparePageContextForUserConsumptionServerSide_js_1.preparePageContextForUserConsumptionServerSide)(pageContext);
21
- const hookReturnValue = await (0, executeHook_js_1.executeHook)(() => hookFn(pageContext), renderHook);
21
+ const hookReturnValue = await (0, executeHook_js_1.executeHook)(() => hookFn(pageContext), renderHook, pageContext);
22
22
  const { documentHtml, pageContextProvidedByRenderHook, pageContextPromise, injectFilter } = processHookReturnValue(hookReturnValue, renderHook);
23
23
  Object.assign(pageContext, pageContextProvidedByRenderHook);
24
24
  (0, utils_js_1.objectAssign)(pageContext, { _pageContextPromise: pageContextPromise });
@@ -69,13 +69,13 @@ function getRenderHook(pageContext) {
69
69
  (0, utils_js_1.assertUsage)(false, [
70
70
  `No ${hookName}() hook found, see https://vike.dev/${hookName}`
71
71
  /*
72
- 'See https://vike.dev/render-modes for more information.',
73
- [
74
- // 'Loaded config files (none of them define the onRenderHtml() hook):',
75
- 'Loaded server-side page files (none of them `export { render }`):',
76
- ...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
77
- ].join('\n')
78
- */
72
+ 'See https://vike.dev/render-modes for more information.',
73
+ [
74
+ // 'Loaded config files (none of them define the onRenderHtml() hook):',
75
+ 'Loaded server-side page files (none of them `export { render }`):',
76
+ ...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
77
+ ].join('\n')
78
+ */
79
79
  ].join(' '));
80
80
  }
81
81
  return hookFound;
@@ -100,8 +100,8 @@ function getHttpResponseBodyStreamHandlers(htmlRender, renderHook) {
100
100
  }
101
101
  }
102
102
  };
103
- function getFixMsg(type, standard) {
104
- const streamName = (0, stream_js_1.getStreamName)(type, standard);
103
+ function getFixMsg(kind, type) {
104
+ const streamName = (0, stream_js_1.getStreamName)(kind, type);
105
105
  (0, utils_js_1.assert)(['a ', 'an ', 'the '].some((s) => streamName.startsWith(s)));
106
106
  (0, utils_js_1.assert)(renderHook);
107
107
  const { hookFilePath, hookName } = renderHook;
@@ -12,7 +12,7 @@ const globalContext_js_1 = require("../globalContext.js");
12
12
  const loadConfigValues_js_1 = require("../../../shared/page-configs/loadConfigValues.js");
13
13
  async function loadUserFilesServerSide(pageContext) {
14
14
  const pageConfig = (0, findPageConfig_js_1.findPageConfig)(pageContext._pageConfigs, pageContext._pageId); // Make pageConfig globally available as pageContext._pageConfig?
15
- const [{ pageFilesLoaded, pageConfigLoaded, ...pageContextExports }] = await Promise.all([
15
+ const [{ pageFilesLoaded, pageContextExports }] = await Promise.all([
16
16
  loadPageUserFiles(pageContext._pageFilesAll, pageConfig, pageContext._pageId, !(0, globalContext_js_1.getGlobalContext)().isProduction),
17
17
  (0, analyzePageClientSide_js_1.analyzePageClientSideInit)(pageContext._pageFilesAll, pageContext._pageId, { sharedPageFilesAlreadyLoaded: true })
18
18
  ]);
@@ -37,8 +37,8 @@ async function loadUserFilesServerSide(pageContext) {
37
37
  });
38
38
  }
39
39
  const pageContextAddendum = {};
40
+ (0, utils_js_1.objectAssign)(pageContextAddendum, pageContextExports);
40
41
  (0, utils_js_1.objectAssign)(pageContextAddendum, {
41
- ...pageContextExports,
42
42
  Page: pageContextExports.exports.Page,
43
43
  _isHtmlOnly: isHtmlOnly,
44
44
  _passToClient: passToClient,
@@ -104,8 +104,7 @@ async function loadPageUserFiles(pageFilesAll, pageConfig, pageId, isDev) {
104
104
  await Promise.all(pageFilesServerSide.map((p) => p.loadFile?.()));
105
105
  const pageContextExports = (0, getPageFiles_js_1.getPageContextExports)(pageFilesServerSide, pageConfigLoaded);
106
106
  return {
107
- ...pageContextExports,
108
- pageFilesLoaded: pageFilesServerSide,
109
- pageConfigLoaded
107
+ pageContextExports,
108
+ pageFilesLoaded: pageFilesServerSide
110
109
  };
111
110
  }