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
@@ -14,12 +14,12 @@ import { logConfigError, logConfigErrorRecover } from '../../../shared/loggerNot
14
14
  import { removeSuperfluousViteLog_enable, removeSuperfluousViteLog_disable } from '../../../shared/loggerVite/removeSuperfluousViteLog.js';
15
15
  import pc from '@brillout/picocolors';
16
16
  import { getConfigDefinedAt } from '../../../../../shared/page-configs/getConfigDefinedAt.js';
17
- import { assertConfigValueIsSerializable } from './getConfigValuesSerialized.js';
18
17
  import { crawlPlusFiles } from './getVikeConfig/crawlPlusFiles.js';
19
18
  import { getConfigFileExport } from './getConfigFileExport.js';
20
19
  import { loadConfigFile, loadImportedFile, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
21
20
  import { clearFilesEnvMap, resolvePointerImportOfConfig } from './getVikeConfig/resolvePointerImport.js';
22
21
  import { getFilePathResolved } from '../../../shared/getFilePath.js';
22
+ import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
23
23
  assertIsNotProductionRuntime();
24
24
  let devServerIsCorrupt = false;
25
25
  let wasConfigInvalid = null;
@@ -166,7 +166,7 @@ async function loadInterfaceFiles(userRootDir, outDirRoot, isDev) {
166
166
  // - If `configDef` is `undefined` => we load the file +{configName}.js later.
167
167
  // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
168
168
  const configDef = getConfigDefinitionOptional(configDefinitionsBuiltIn, configName);
169
- if (configDef && isConfigEnv(configDef, configName)) {
169
+ if (configDef && isLoadableAtBuildTime(configDef)) {
170
170
  await loadValueFile(interfaceFile, configName, userRootDir);
171
171
  }
172
172
  }
@@ -241,6 +241,7 @@ async function loadVikeConfig_withErrorHandling(userRootDir, outDirRoot, isDev,
241
241
  const dummyData = {
242
242
  pageConfigs: [],
243
243
  pageConfigGlobal: {
244
+ configDefinitions: {},
244
245
  configValueSources: {}
245
246
  },
246
247
  globalVikeConfig: {}
@@ -266,7 +267,7 @@ async function loadVikeConfig(userRootDir, outDirRoot, isDev) {
266
267
  if (isGlobalConfig(configName))
267
268
  return;
268
269
  const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
269
- if (!isConfigEnv(configDef, configName))
270
+ if (!isLoadableAtBuildTime(configDef))
270
271
  return;
271
272
  const isAlreadyLoaded = interfacefileIsAlreaydLoaded(interfaceFile);
272
273
  if (isAlreadyLoaded)
@@ -288,14 +289,13 @@ async function loadVikeConfig(userRootDir, outDirRoot, isDev) {
288
289
  const { routeFilesystem, isErrorPage } = determineRouteFilesystem(locationId, configValueSources);
289
290
  applyEffectsAll(configValueSources, configDefinitions);
290
291
  const configValuesComputed = getComputed(configValueSources, configDefinitions);
291
- const configValues = getConfigValues(configValueSources, configValuesComputed, configDefinitions);
292
292
  const pageConfig = {
293
293
  pageId: locationId,
294
294
  isErrorPage,
295
295
  routeFilesystem,
296
+ configDefinitions,
296
297
  configValueSources,
297
- configValuesComputed,
298
- configValues
298
+ configValuesComputed
299
299
  };
300
300
  return pageConfig;
301
301
  }));
@@ -328,7 +328,7 @@ function assertOnBeforeRenderEnv(pageConfig) {
328
328
  if (!onBeforeRenderConfig)
329
329
  return;
330
330
  const onBeforeRenderEnv = onBeforeRenderConfig.configEnv;
331
- const isClientRouting = !!pageConfig.configValues.clientRouting?.value;
331
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
332
332
  // When using Server Routing, loading a onBeforeRender() hook on the client-side hasn't any effect (the Server Routing's client runtime never calls it); it unnecessarily bloats client bundle sizes
333
333
  assertUsage(!(onBeforeRenderEnv.client && !isClientRouting), `Page ${pageConfig.pageId} has an onBeforeRender() hook with env ${pc.cyan(JSON.stringify(onBeforeRenderEnv))} which doesn't make sense because the page is using Server Routing: onBeforeRender() can be run in the client only when using Client Routing.`);
334
334
  }
@@ -389,6 +389,7 @@ async function getGlobalConfigs(interfaceFilesByLocationId, userRootDir, importe
389
389
  }
390
390
  const globalVikeConfig = {};
391
391
  const pageConfigGlobal = {
392
+ configDefinitions: configDefinitionsBuiltInGlobal,
392
393
  configValueSources: {}
393
394
  };
394
395
  await Promise.all(objectEntries(configDefinitionsBuiltInGlobal).map(async ([configName, configDef]) => {
@@ -422,7 +423,15 @@ async function resolveConfigValueSources(configName, configDef, interfaceFilesRe
422
423
  const add = (interfaceFile) => {
423
424
  assert(!visited.has(interfaceFile));
424
425
  visited.add(interfaceFile);
425
- sourcesInfo.push([configName, interfaceFile, configDef, userRootDir, importedFilesLoaded]);
426
+ const isHighestInheritancePrecedence = sourcesInfo.length === 0;
427
+ sourcesInfo.push([
428
+ configName,
429
+ interfaceFile,
430
+ configDef,
431
+ userRootDir,
432
+ importedFilesLoaded,
433
+ isHighestInheritancePrecedence
434
+ ]);
426
435
  };
427
436
  // Main resolution logic
428
437
  {
@@ -493,7 +502,7 @@ function warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden,
493
502
  function isInterfaceFileUserLand(interfaceFile) {
494
503
  return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtend) || interfaceFile.isValueFile;
495
504
  }
496
- async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded) {
505
+ async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded, isHighestInheritancePrecedence) {
497
506
  const conf = interfaceFile.fileExportsByConfigName[configName];
498
507
  assert(conf);
499
508
  const configEnv = deriveConfigEnvFromFileName(configDef.env, interfaceFile.filePath.fileName);
@@ -502,6 +511,7 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
502
511
  ...interfaceFile.filePath,
503
512
  fileExportPathToShowToUser: ['default', configName]
504
513
  };
514
+ const isOverriden = configDef.cumulative ? false : !isHighestInheritancePrecedence;
505
515
  // +client.js
506
516
  if (configDef._valueIsFilePath) {
507
517
  let definedAtFilePath;
@@ -528,7 +538,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
528
538
  valueIsFilePath: true,
529
539
  configEnv,
530
540
  valueIsImportedAtRuntime: true,
531
- valueIsDefinedByValueFile: false,
541
+ valueIsDefinedByPlusFile: false,
542
+ isOverriden,
532
543
  definedAtFilePath
533
544
  };
534
545
  return configValueSource;
@@ -544,11 +555,12 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
544
555
  locationId,
545
556
  configEnv,
546
557
  valueIsImportedAtRuntime: true,
547
- valueIsDefinedByValueFile: false,
558
+ valueIsDefinedByPlusFile: false,
559
+ isOverriden,
548
560
  definedAtFilePath: pointerImport
549
561
  };
550
- // Load fake import
551
- if (isConfigEnv(configDef, configName) &&
562
+ // Load pointer import
563
+ if (isLoadableAtBuildTime(configDef) &&
552
564
  // The value of `extends` was already loaded and already used: we don't need the value of `extends` anymore
553
565
  configName !== 'extends') {
554
566
  if (pointerImport.filePathAbsoluteFilesystem) {
@@ -568,7 +580,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
568
580
  value: configValue,
569
581
  configEnv,
570
582
  valueIsImportedAtRuntime: false,
571
- valueIsDefinedByValueFile: false,
583
+ valueIsDefinedByPlusFile: false,
584
+ isOverriden,
572
585
  definedAtFilePath: definedAtFilePath_
573
586
  };
574
587
  return configValueSource;
@@ -581,7 +594,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
581
594
  locationId,
582
595
  configEnv,
583
596
  valueIsImportedAtRuntime: !valueAlreadyLoaded,
584
- valueIsDefinedByValueFile: true,
597
+ valueIsDefinedByPlusFile: true,
598
+ isOverriden,
585
599
  definedAtFilePath: {
586
600
  ...interfaceFile.filePath,
587
601
  fileExportPathToShowToUser: configName === interfaceFile.configName
@@ -876,59 +890,6 @@ function determineIsErrorPage(routeFilesystem) {
876
890
  function isVikeConfigFile(filePath) {
877
891
  return !!getConfigName(filePath);
878
892
  }
879
- function getConfigValues(configValueSources, configValuesComputed, configDefinitions) {
880
- const configValues = {};
881
- Object.entries(configValuesComputed).forEach(([configName, configValueComputed]) => {
882
- configValues[configName] = {
883
- type: 'computed',
884
- value: configValueComputed.value,
885
- definedAtData: null
886
- };
887
- });
888
- Object.entries(configValueSources).forEach(([configName, sources]) => {
889
- const configDef = configDefinitions[configName];
890
- assert(configDef);
891
- if (!configDef.cumulative) {
892
- const configValueSource = sources[0];
893
- if ('value' in configValueSource) {
894
- configValues[configName] = {
895
- type: 'classic',
896
- value: configValueSource.value,
897
- definedAtData: getDefinedAtFile(configValueSource)
898
- };
899
- }
900
- }
901
- else {
902
- const value = mergeCumulative(configName, sources);
903
- const definedAtData = sources.map((source) => getDefinedAtFile(source));
904
- assert(value.length === definedAtData.length);
905
- configValues[configName] = {
906
- type: 'cumulative',
907
- value,
908
- definedAtData
909
- };
910
- }
911
- });
912
- return configValues;
913
- }
914
- function getDefinedAtFile(configValueSource) {
915
- return {
916
- filePathToShowToUser: configValueSource.definedAtFilePath.filePathToShowToUser,
917
- fileExportPathToShowToUser: configValueSource.definedAtFilePath.fileExportPathToShowToUser
918
- };
919
- }
920
- function mergeCumulative(configName, configValueSources) {
921
- const configValues = [];
922
- configValueSources.forEach((configValueSource) => {
923
- // We could, in principle, also support cumulative for values that aren't loaded at config-time but it isn't completely trivial to implement.
924
- assert('value' in configValueSource);
925
- // Make sure configValueSource.value is serializable
926
- assertConfigValueIsSerializable(configValueSource.value, configName, getDefinedAtFile(configValueSource));
927
- const { value } = configValueSource;
928
- configValues.push(value);
929
- });
930
- return configValues;
931
- }
932
893
  function getConfigEnvValue(val, errMsgIntro) {
933
894
  const errInvalidValue = `${errMsgIntro} an invalid value ${pc.cyan(JSON.stringify(val))}`;
934
895
  // Legacy outdated values
@@ -971,13 +932,8 @@ function getConfigDefinition(configDefinitions, configName, filePathToShowToUser
971
932
  function getConfigDefinitionOptional(configDefinitions, configName) {
972
933
  return configDefinitions[configName] ?? null;
973
934
  }
974
- function isConfigEnv(configDef, configName) {
975
- const configEnv = configDef.env;
976
- if (configDef.cumulative) {
977
- // In principle we could lift that requirement (but it requires non-trivial modifications)
978
- assertUsage(configEnv.config, `Config ${pc.cyan(configName)} needs its ${pc.cyan('env')} to have ${pc.cyan('{ config: true }')} (because ${pc.cyan(configName)} is a ${pc.cyan('cumulative')} config)`);
979
- }
980
- return !!configEnv.config;
935
+ function isLoadableAtBuildTime(configDef) {
936
+ return !!configDef.env.config && !configDef._valueIsFilePath;
981
937
  }
982
938
  function isGlobalConfig(configName) {
983
939
  if (configName === 'prerender')
@@ -4,13 +4,11 @@ import { getVirtualFileIdPageConfigValuesAll, isVirtualFileIdPageConfigValuesAll
4
4
  import { getVikeConfig } from './getVikeConfig.js';
5
5
  import { extractAssetsAddQuery } from '../../../../shared/extractAssetsQuery.js';
6
6
  import { debug } from './debug.js';
7
- import { getConfigValue } from '../../../../../shared/page-configs/getConfigValue.js';
8
- import { getConfigValueSourcesNotOverriden } from '../../../shared/getConfigValueSourcesNotOverriden.js';
9
7
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
10
- import { serializeConfigValueImported } from '../../../../../shared/page-configs/serialize/serializeConfigValue.js';
8
+ import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
11
9
  import { getConfigVike } from '../../../../shared/getConfigVike.js';
12
- import { getConfigValuesSerialized } from './getConfigValuesSerialized.js';
13
10
  import { fixServerAssets_isEnabled } from '../../buildConfig/fixServerAssets.js';
11
+ import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
14
12
  async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
15
13
  const result = isVirtualFileIdPageConfigValuesAll(id);
16
14
  assert(result);
@@ -32,16 +30,9 @@ async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
32
30
  function getLoadConfigValuesAll(pageConfig, isForClientSide, pageId, includeAssetsImportedByServer, isDev) {
33
31
  const lines = [];
34
32
  const importStatements = [];
35
- const isClientRouting = getConfigValue(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
36
- lines.push('export const configValuesImported = [');
37
- lines.push(getConfigValuesImported(pageConfig, isForClientSide, isClientRouting, importStatements));
38
- lines.push('];');
33
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
39
34
  lines.push('export const configValuesSerialized = {');
40
- lines.push(getConfigValuesSerialized(pageConfig, (configEnv, configValueSource) => isEnvMatch(configEnv, !configValueSource ? false : checkWhetherIsImport(configValueSource), {
41
- isImport: false,
42
- isForClientSide,
43
- isClientRouting
44
- })));
35
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: false, isDev }), ''));
45
36
  lines.push('};');
46
37
  if (!fixServerAssets_isEnabled() && includeAssetsImportedByServer && isForClientSide && !isDev) {
47
38
  importStatements.push(`import '${extractAssetsAddQuery(getVirtualFileIdPageConfigValuesAll(pageId, false))}'`);
@@ -49,33 +40,3 @@ function getLoadConfigValuesAll(pageConfig, isForClientSide, pageId, includeAsse
49
40
  const code = [...importStatements, ...lines].join('\n');
50
41
  return code;
51
42
  }
52
- function getConfigValuesImported(pageConfig, isForClientSide, isClientRouting, importStatements) {
53
- const lines = [];
54
- const varCounterContainer = { varCounter: 0 };
55
- getConfigValueSourcesNotOverriden(pageConfig).forEach((configValueSource) => {
56
- if (!isEnvMatch(configValueSource.configEnv, checkWhetherIsImport(configValueSource), {
57
- isImport: true,
58
- isForClientSide,
59
- isClientRouting
60
- }))
61
- return;
62
- const whitespace = ' ';
63
- lines.push(...serializeConfigValueImported(configValueSource, configValueSource.configName, whitespace, varCounterContainer, importStatements));
64
- });
65
- const code = lines.join('\n');
66
- return code;
67
- }
68
- function checkWhetherIsImport(configValueSource) {
69
- const { valueIsImportedAtRuntime, valueIsFilePath } = configValueSource;
70
- return valueIsImportedAtRuntime && !valueIsFilePath;
71
- }
72
- function isEnvMatch(configEnv, isImport, runtime) {
73
- // Whether config value is imported or serialized
74
- if (isImport !== runtime.isImport)
75
- return false;
76
- // Runtime match
77
- const { isForClientSide, isClientRouting } = runtime;
78
- if (!isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: false }))
79
- return false;
80
- return true;
81
- }
@@ -1,11 +1,9 @@
1
1
  export { getVirtualFilePageConfigs };
2
- import { assert, objectEntries } from '../../../utils.js';
3
2
  import { getVirtualFileIdPageConfigValuesAll } from '../../../../shared/virtual-files/virtualFilePageConfigValuesAll.js';
4
3
  import { debug } from './debug.js';
5
4
  import { getVikeConfig } from './getVikeConfig.js';
6
5
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
7
- import { serializeConfigValueImported } from '../../../../../shared/page-configs/serialize/serializeConfigValue.js';
8
- import { getConfigValuesSerialized } from './getConfigValuesSerialized.js';
6
+ import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
9
7
  async function getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRouting, config) {
10
8
  const { pageConfigs, pageConfigGlobal } = await getVikeConfig(config, isDev, true);
11
9
  return getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting);
@@ -13,18 +11,17 @@ async function getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRou
13
11
  function getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting) {
14
12
  const lines = [];
15
13
  const importStatements = [];
16
- const varCounterContainer = { varCounter: 0 };
17
14
  lines.push('export const pageConfigsSerialized = [');
18
- lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, importStatements, varCounterContainer));
15
+ lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements));
19
16
  lines.push('];');
20
17
  lines.push('export const pageConfigGlobalSerialized = {');
21
- lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isDev, importStatements, varCounterContainer));
18
+ lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements));
22
19
  lines.push('};');
23
20
  const code = [...importStatements, ...lines].join('\n');
24
21
  debug(id, isForClientSide ? 'CLIENT-SIDE' : 'SERVER-SIDE', code);
25
22
  return code;
26
23
  }
27
- function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, importStatements, varCounterContainer) {
24
+ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements) {
28
25
  const lines = [];
29
26
  pageConfigs.forEach((pageConfig) => {
30
27
  const { pageId, routeFilesystem, isErrorPage } = pageConfig;
@@ -34,57 +31,19 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
34
31
  lines.push(` isErrorPage: ${JSON.stringify(isErrorPage)},`);
35
32
  lines.push(` routeFilesystem: ${JSON.stringify(routeFilesystem)},`);
36
33
  lines.push(` loadConfigValuesAll: () => import(${JSON.stringify(virtualFileIdPageConfigValuesAll)}),`);
37
- // Serialized config values
38
34
  lines.push(` configValuesSerialized: {`);
39
- lines.push(getConfigValuesSerialized(pageConfig, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true })));
35
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true, isDev }), ' '));
40
36
  lines.push(` },`);
41
- // Imported config values
42
- const whitespace = ' ';
43
- lines.push(`${whitespace}configValuesImported: [`);
44
- Object.entries(pageConfig.configValueSources).forEach(([configName, sources]) => {
45
- const configValue = pageConfig.configValues[configName];
46
- if (configValue)
47
- return;
48
- const configValueSource = sources[0];
49
- assert(configValueSource);
50
- if (!configValueSource.configEnv.eager)
51
- return;
52
- if (!isRuntimeEnvMatch(configValueSource.configEnv, { isForClientSide, isClientRouting, isEager: true }))
53
- return;
54
- lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, varCounterContainer, importStatements));
55
- });
56
- lines.push(`${whitespace}],`);
57
37
  lines.push(` },`);
58
38
  });
59
39
  const code = lines.join('\n');
60
40
  return code;
61
41
  }
62
- function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isDev, importStatements, varCounterContainer) {
42
+ function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements) {
63
43
  const lines = [];
64
- /* Nothing (yet)
65
- lines.push(` configValuesSerialized: {`)
66
- lines.push(` },`)
67
- */
68
- lines.push(` configValuesImported: [`);
69
- objectEntries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
70
- if (configName === 'onBeforeRoute') {
71
- // if( isForClientSide && !isClientRouting ) return
72
- }
73
- else if (configName === 'onPrerenderStart') {
74
- if (isDev || isForClientSide) {
75
- // Only load onPrerenderStart() in server production runtime
76
- return;
77
- }
78
- }
79
- else {
80
- assert(false);
81
- }
82
- const configValueSource = sources[0];
83
- assert(configValueSource);
84
- const whitespace = ' ';
85
- lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, varCounterContainer, importStatements));
86
- });
87
- lines.push(` ],`);
44
+ lines.push(` configValuesSerialized: {`);
45
+ lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true, isDev }), ' '));
46
+ lines.push(` },`);
88
47
  const code = lines.join('\n');
89
48
  return code;
90
49
  }
@@ -4,4 +4,5 @@ declare function isRuntimeEnvMatch(configEnv: ConfigEnvInternal, runtime: {
4
4
  isForClientSide: boolean;
5
5
  isClientRouting: boolean;
6
6
  isEager: boolean;
7
+ isDev: boolean;
7
8
  }): boolean;
@@ -14,5 +14,11 @@ function isRuntimeEnvMatch(configEnv, runtime) {
14
14
  // Eager
15
15
  if (runtime.isEager !== !!configEnv.eager)
16
16
  return false;
17
+ // Production/development
18
+ if (
19
+ //
20
+ (configEnv.production === true && runtime.isDev) ||
21
+ (configEnv.production === false && !runtime.isDev))
22
+ return false;
17
23
  return true;
18
24
  }
@@ -1,5 +1,7 @@
1
1
  export { addSsrMiddleware };
2
2
  import { renderPage } from '../../runtime/renderPage.js';
3
+ import { assertWarning } from '../utils.js';
4
+ import pc from '@brillout/picocolors';
3
5
  function addSsrMiddleware(middlewares) {
4
6
  middlewares.use(async (req, res, next) => {
5
7
  if (res.headersSent)
@@ -8,11 +10,21 @@ function addSsrMiddleware(middlewares) {
8
10
  if (!url)
9
11
  return next();
10
12
  const { headers } = req;
11
- const userAgent = headers['user-agent'];
12
13
  const pageContextInit = {
13
14
  urlOriginal: url,
14
- userAgent
15
+ headersOriginal: headers
15
16
  };
17
+ Object.defineProperty(pageContextInit, 'userAgent', {
18
+ get() {
19
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
20
+ assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
21
+ showStackTrace: true,
22
+ onlyOnce: true
23
+ });
24
+ return headers['user-agent'];
25
+ },
26
+ enumerable: false
27
+ });
16
28
  let pageContext;
17
29
  try {
18
30
  pageContext = await renderPage(pageContextInit);
@@ -5,7 +5,7 @@ export { runPrerender_forceExit };
5
5
  import '../runtime/page-files/setup.js';
6
6
  import path from 'path';
7
7
  import { route } from '../../shared/route/index.js';
8
- import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertPathFilesystemAbsolute, isArray } from './utils.js';
8
+ import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertPathFilesystemAbsolute, isArray, changeEnumerable } from './utils.js';
9
9
  import { prerenderPage, prerender404Page, getRenderContext, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
10
10
  import pc from '@brillout/picocolors';
11
11
  import { cpus } from 'os';
@@ -16,10 +16,10 @@ import { getPageFilesServerSide } from '../../shared/getPageFiles.js';
16
16
  import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
17
17
  import { getUrlFromRouteString } from '../../shared/route/resolveRouteString.js';
18
18
  import { getConfigValueFilePathToShowToUser } from '../../shared/page-configs/helpers.js';
19
- import { getConfigValue } from '../../shared/page-configs/getConfigValue.js';
19
+ import { getConfigValueRuntime } from '../../shared/page-configs/getConfigValue.js';
20
20
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
21
21
  import { isErrorPage } from '../../shared/error-page.js';
22
- import { addUrlComputedProps } from '../../shared/addUrlComputedProps.js';
22
+ import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.js';
23
23
  import { isAbortError } from '../../shared/route/abort.js';
24
24
  import { loadUserFilesServerSide } from '../runtime/renderPage/loadUserFilesServerSide.js';
25
25
  import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, setIsPrerenderering } from '../../shared/hooks/getHook.js';
@@ -27,6 +27,7 @@ import { noRouteMatch } from '../../shared/route/noRouteMatch.js';
27
27
  import { getVikeConfig } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
28
28
  import { logErrorHint } from '../runtime/renderPage/logErrorHint.js';
29
29
  import { executeHook, isUserHookError } from '../../shared/hooks/executeHook.js';
30
+ import { getConfigValueBuildTime } from '../../shared/page-configs/getConfigValueBuildTime.js';
30
31
  async function runPrerenderFromAPI(options = {}) {
31
32
  await runPrerender(options, 'prerender()');
32
33
  // - 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.
@@ -114,7 +115,7 @@ async function collectDoNoPrerenderList(renderContext, pageConfigs, doNotPrerend
114
115
  // V1 design
115
116
  pageConfigs.forEach((pageConfig) => {
116
117
  const configName = 'prerender';
117
- const configValue = getConfigValue(pageConfig, configName, 'boolean');
118
+ const configValue = getConfigValueBuildTime(pageConfig, configName, 'boolean');
118
119
  if (configValue?.value === false) {
119
120
  const configValueFilePathToShowToUser = getConfigValueFilePathToShowToUser(configValue.definedAtData);
120
121
  assert(configValueFilePathToShowToUser);
@@ -217,7 +218,7 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
217
218
  if (doNotPrerenderList.find((p) => p.pageId === pageId)) {
218
219
  return;
219
220
  }
220
- const prerenderResult = await executeHook(() => hookFn(), { hookName, hookFilePath, hookTimeout });
221
+ const prerenderResult = await executeHook(() => hookFn(), { hookName, hookFilePath, hookTimeout }, null);
221
222
  const result = normalizeOnPrerenderHookResult(prerenderResult, hookFilePath, hookName);
222
223
  result.forEach(({ url, pageContext }) => {
223
224
  {
@@ -240,9 +241,9 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
240
241
  prerenderContext.pageContexts.push(pageContextNew);
241
242
  if (pageContext) {
242
243
  objectAssign(pageContextNew, {
243
- _pageContextAlreadyProvidedByOnPrerenderHook: true,
244
- ...pageContext
244
+ _pageContextAlreadyProvidedByOnPrerenderHook: true
245
245
  });
246
+ objectAssign(pageContextNew, pageContext);
246
247
  }
247
248
  });
248
249
  })));
@@ -300,14 +301,11 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
300
301
  _prerenderContext: prerenderContext
301
302
  };
302
303
  const pageContextInit = {
303
- urlOriginal,
304
- ...prerenderContext.pageContextInit
304
+ urlOriginal
305
305
  };
306
+ objectAssign(pageContextInit, prerenderContext.pageContextInit);
306
307
  {
307
- const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext, {
308
- // We set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in a onPrerenderStart() hook, e.g. /examples/i18n/
309
- urlComputedPropsNonEnumerable: true
310
- });
308
+ const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext);
311
309
  objectAssign(pageContext, pageContextInitEnhanced);
312
310
  }
313
311
  return pageContext;
@@ -382,6 +380,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
382
380
  pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
383
381
  });
384
382
  const docLink = 'https://vike.dev/i18n#pre-rendering';
383
+ // Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
384
+ const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
385
385
  let result = await executeHook(() => hookFn({
386
386
  pageContexts: prerenderContext.pageContexts,
387
387
  // TODO/v1-release: remove warning
@@ -392,7 +392,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
392
392
  });
393
393
  return prerenderContext.pageContexts;
394
394
  }
395
- }), onPrerenderStartHook);
395
+ }), onPrerenderStartHook, null);
396
+ restoreEnumerable();
396
397
  if (result === null || result === undefined) {
397
398
  return;
398
399
  }
@@ -430,9 +431,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
430
431
  hookName
431
432
  };
432
433
  }
433
- // Restore as URL computed props are lost when user makes a pageContext copy
434
- addUrlComputedProps(pageContext);
435
434
  });
435
+ addPageContextComputedUrl(prerenderContext.pageContexts);
436
436
  }
437
437
  async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete) {
438
438
  const globalContext = getGlobalContext();
@@ -474,7 +474,7 @@ async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete)
474
474
  if (pageContext._pageConfigs.length > 0) {
475
475
  const pageConfig = pageContext._pageConfigs.find((p) => p.pageId === pageId);
476
476
  assert(pageConfig);
477
- usesClientRouter = getConfigValue(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
477
+ usesClientRouter = getConfigValueRuntime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
478
478
  }
479
479
  else {
480
480
  usesClientRouter = globalContext.pluginManifest.usesClientRouter;
@@ -714,3 +714,23 @@ function assertIsNotAbort(err, urlOr404) {
714
714
  assert(abortCall);
715
715
  assertUsage(false, `${pc.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${pc.cyan(abortCaller)} isn't supported for pre-rendered pages`);
716
716
  }
717
+ function makePageContextComputedUrlNonEnumerable(pageContexts) {
718
+ change(false);
719
+ return { restoreEnumerable, addPageContextComputedUrl };
720
+ function restoreEnumerable() {
721
+ change(true);
722
+ }
723
+ function addPageContextComputedUrl(pageContexts) {
724
+ // Add URL computed props to the user-generated pageContext copies
725
+ pageContexts.forEach((pageContext) => {
726
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContext);
727
+ objectAssign(pageContext, pageContextUrlComputed);
728
+ });
729
+ }
730
+ function change(enumerable) {
731
+ pageContexts.forEach((pageContext) => {
732
+ changeEnumerable(pageContext, 'urlPathname', enumerable);
733
+ changeEnumerable(pageContext, 'urlParsed', enumerable);
734
+ });
735
+ }
736
+ }
@@ -13,3 +13,4 @@ export * from '../../utils/assertNodeEnv.js';
13
13
  export * from '../../utils/pLimit.js';
14
14
  export * from '../../utils/assertPathFilesystemAbsolute.js';
15
15
  export * from '../../utils/isArray.js';
16
+ export * from '../../utils/changeEnumerable.js';
@@ -15,3 +15,4 @@ export * from '../../utils/assertNodeEnv.js';
15
15
  export * from '../../utils/pLimit.js';
16
16
  export * from '../../utils/assertPathFilesystemAbsolute.js';
17
17
  export * from '../../utils/isArray.js';
18
+ export * from '../../utils/changeEnumerable.js';
@@ -107,7 +107,7 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
107
107
  });
108
108
  }
109
109
  // The JavaScript entry <script> tag
110
- const scriptEntry = await mergeScriptEntries(pageAssets, isProduction);
110
+ const scriptEntry = await mergeScriptEntries(pageAssets);
111
111
  if (scriptEntry) {
112
112
  htmlTags.push({
113
113
  htmlTag: scriptEntry,
@@ -128,11 +128,11 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
128
128
  });
129
129
  return htmlTags;
130
130
  }
131
- async function mergeScriptEntries(pageAssets, isProduction) {
131
+ async function mergeScriptEntries(pageAssets) {
132
132
  const scriptEntries = pageAssets.filter((pageAsset) => pageAsset.isEntry && pageAsset.assetType === 'script');
133
133
  const viteScripts = await getViteDevScripts();
134
134
  const scriptTagsHtml = `${viteScripts}${scriptEntries.map((asset) => inferAssetTag(asset)).join('')}`;
135
- const scriptTag = mergeScriptTags(scriptTagsHtml, isProduction);
135
+ const scriptTag = mergeScriptTags(scriptTagsHtml);
136
136
  return scriptTag;
137
137
  }
138
138
  function getPageContextJsonScriptTag(pageContext) {
@@ -1,6 +1,6 @@
1
1
  export { getViteDevScripts };
2
2
  import { getGlobalContext } from '../../globalContext.js';
3
- import { assert, assertUsage } from '../../utils.js';
3
+ import { assert, assertUsage, assertWarning } from '../../utils.js';
4
4
  import pc from '@brillout/picocolors';
5
5
  async function getViteDevScripts() {
6
6
  const globalContext = getGlobalContext();
@@ -16,7 +16,8 @@ async function getViteDevScripts() {
16
16
  assertUsage(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), 'Vite plugins that minify the HTML are not supported by vike, see https://github.com/vikejs/vike/issues/224');
17
17
  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.');
18
18
  const viteInjection = fakeHtml.slice(fakeHtmlBegin.length, -1 * fakeHtmlEnd.length);
19
- assert(viteInjection.includes('script'), { viteInjection });
19
+ assert(viteInjection.includes('script'));
20
+ assertWarning(!viteInjection.includes('import('), 'Unexpected Vite HMR code. Reach out to a Vike maintainer on GitHub.', { onlyOnce: true });
20
21
  const scriptTags = viteInjection;
21
22
  return scriptTags;
22
23
  }
@@ -1,2 +1,2 @@
1
1
  export { mergeScriptTags };
2
- declare function mergeScriptTags(scriptTagsHtml: string, isProduction: boolean): string;
2
+ declare function mergeScriptTags(scriptTagsHtml: string): string;