vike 0.4.224 → 0.4.225-commit-2b7971f

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 (163) hide show
  1. package/dist/cjs/client/shared/getPageContextProxyForUser.js +3 -66
  2. package/dist/cjs/node/api/build.js +1 -1
  3. package/dist/cjs/node/api/context.js +4 -4
  4. package/dist/cjs/node/api/dev.js +1 -1
  5. package/dist/cjs/node/api/prepareViteApiCall.js +25 -14
  6. package/dist/cjs/node/api/prerender.js +1 -1
  7. package/dist/cjs/node/api/preview.js +1 -1
  8. package/dist/cjs/node/cli/context.js +5 -4
  9. package/dist/cjs/node/cli/entry.js +3 -3
  10. package/dist/cjs/node/cli/parseCli.js +43 -15
  11. package/dist/cjs/node/cli/utils.js +1 -1
  12. package/dist/cjs/node/plugin/plugins/build/pluginBuildEntry.js +1 -1
  13. package/dist/cjs/node/plugin/plugins/commonConfig.js +16 -11
  14. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +6 -4
  15. package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -1
  16. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +14 -10
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -2
  18. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  19. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +139 -84
  20. package/dist/cjs/node/plugin/plugins/previewConfig.js +12 -7
  21. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +10 -1
  22. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +5 -1
  23. package/dist/cjs/node/plugin/shared/getEnvVarObject.js +9 -8
  24. package/dist/cjs/node/plugin/shared/loggerNotProd/log.js +1 -1
  25. package/dist/cjs/node/prerender/context.js +1 -1
  26. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +33 -18
  27. package/dist/cjs/node/prerender/runPrerender.js +12 -18
  28. package/dist/cjs/node/prerender/utils.js +1 -1
  29. package/dist/cjs/node/runtime/globalContext.js +9 -5
  30. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  31. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +67 -14
  32. package/dist/cjs/node/runtime/html/stream.js +7 -0
  33. package/dist/cjs/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +14 -5
  34. package/dist/cjs/node/runtime/renderPage/createHttpResponse.js +2 -4
  35. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +6 -1
  36. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +3 -0
  37. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +18 -12
  38. package/dist/cjs/node/runtime/renderPage.js +19 -38
  39. package/dist/cjs/node/runtime/utils.js +0 -1
  40. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +10 -8
  41. package/dist/cjs/node/shared/assertV1Design.js +2 -1
  42. package/dist/cjs/node/shared/utils.js +0 -1
  43. package/dist/cjs/shared/NOT_SERIALIZABLE.js +5 -0
  44. package/dist/cjs/shared/page-configs/getConfigDefinedAt.js +19 -2
  45. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +8 -5
  46. package/dist/cjs/shared/page-configs/helpers.js +1 -1
  47. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  48. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +9 -5
  49. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  50. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  51. package/dist/cjs/utils/assert.js +12 -5
  52. package/dist/cjs/utils/assertSingleInstance.js +11 -17
  53. package/dist/cjs/utils/debug.js +2 -1
  54. package/dist/cjs/utils/getRandomId.js +1 -1
  55. package/dist/cjs/utils/normalizeHeaders.js +1 -1
  56. package/dist/cjs/utils/objectAssign.js +7 -2
  57. package/dist/cjs/utils/parseUrl-extras.js +1 -0
  58. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +3 -1
  59. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  60. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +1 -1
  61. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +6 -3
  62. package/dist/esm/client/server-routing-runtime/getPageContext.js +6 -3
  63. package/dist/esm/client/shared/getPageContextProxyForUser.d.ts +1 -11
  64. package/dist/esm/client/shared/getPageContextProxyForUser.js +4 -67
  65. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +2 -2
  66. package/dist/esm/node/api/build.js +1 -1
  67. package/dist/esm/node/api/context.d.ts +8 -2
  68. package/dist/esm/node/api/context.js +4 -4
  69. package/dist/esm/node/api/dev.js +1 -1
  70. package/dist/esm/node/api/prepareViteApiCall.d.ts +2 -2
  71. package/dist/esm/node/api/prepareViteApiCall.js +25 -14
  72. package/dist/esm/node/api/prerender.js +1 -1
  73. package/dist/esm/node/api/preview.js +1 -1
  74. package/dist/esm/node/api/types.d.ts +7 -0
  75. package/dist/esm/node/cli/context.d.ts +4 -2
  76. package/dist/esm/node/cli/context.js +5 -4
  77. package/dist/esm/node/cli/entry.js +4 -4
  78. package/dist/esm/node/cli/parseCli.d.ts +3 -0
  79. package/dist/esm/node/cli/parseCli.js +44 -16
  80. package/dist/esm/node/cli/utils.d.ts +1 -1
  81. package/dist/esm/node/cli/utils.js +1 -1
  82. package/dist/esm/node/plugin/plugins/build/pluginBuildEntry.js +2 -2
  83. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +1 -0
  84. package/dist/esm/node/plugin/plugins/commonConfig.js +16 -11
  85. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +6 -4
  86. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -1
  87. package/dist/esm/node/plugin/plugins/importUserCode/index.js +15 -11
  88. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +3 -1
  89. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -2
  90. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +5 -2
  91. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  92. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +3 -2
  93. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +141 -85
  94. package/dist/esm/node/plugin/plugins/previewConfig.js +12 -7
  95. package/dist/esm/node/plugin/plugins/setGlobalContext.js +11 -2
  96. package/dist/esm/node/plugin/shared/addSsrMiddleware.d.ts +1 -1
  97. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +5 -1
  98. package/dist/esm/node/plugin/shared/getEnvVarObject.d.ts +3 -1
  99. package/dist/esm/node/plugin/shared/getEnvVarObject.js +9 -8
  100. package/dist/esm/node/plugin/shared/loggerNotProd/log.js +2 -2
  101. package/dist/esm/node/prerender/context.js +1 -1
  102. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +2 -1
  103. package/dist/esm/node/prerender/resolvePrerenderConfig.js +34 -19
  104. package/dist/esm/node/prerender/runPrerender.js +13 -19
  105. package/dist/esm/node/prerender/utils.d.ts +1 -1
  106. package/dist/esm/node/prerender/utils.js +1 -1
  107. package/dist/esm/node/runtime/globalContext.d.ts +1 -1
  108. package/dist/esm/node/runtime/globalContext.js +10 -6
  109. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  110. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +2 -0
  111. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +69 -15
  112. package/dist/esm/node/runtime/html/stream.js +7 -0
  113. package/dist/esm/node/runtime/index-deprecated.d.ts +1 -3
  114. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.d.ts +3 -1
  115. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +15 -6
  116. package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +3 -1
  117. package/dist/esm/node/runtime/renderPage/createHttpResponse.js +2 -4
  118. package/dist/esm/node/runtime/renderPage/logErrorHint.js +6 -1
  119. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +3 -0
  120. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +32 -6
  121. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +18 -12
  122. package/dist/esm/node/runtime/renderPage.js +21 -40
  123. package/dist/esm/node/runtime/utils.d.ts +0 -1
  124. package/dist/esm/node/runtime/utils.js +0 -1
  125. package/dist/esm/node/runtime-dev/createDevMiddleware.js +10 -8
  126. package/dist/esm/node/shared/assertV1Design.js +2 -1
  127. package/dist/esm/node/shared/utils.d.ts +0 -1
  128. package/dist/esm/node/shared/utils.js +0 -1
  129. package/dist/esm/shared/NOT_SERIALIZABLE.d.ts +1 -0
  130. package/dist/esm/shared/NOT_SERIALIZABLE.js +2 -0
  131. package/dist/esm/shared/page-configs/Config.d.ts +23 -3
  132. package/dist/esm/shared/page-configs/PageConfig.d.ts +17 -6
  133. package/dist/esm/shared/page-configs/getConfigDefinedAt.d.ts +5 -3
  134. package/dist/esm/shared/page-configs/getConfigDefinedAt.js +20 -3
  135. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +8 -5
  136. package/dist/esm/shared/page-configs/helpers.js +1 -1
  137. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +1 -1
  138. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  139. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +3 -3
  140. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +9 -5
  141. package/dist/esm/shared/route/abort.d.ts +2 -2
  142. package/dist/esm/shared/route/loadPageRoutes.js +2 -2
  143. package/dist/esm/shared/types.d.ts +39 -3
  144. package/dist/esm/types/index.d.ts +2 -0
  145. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  146. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  147. package/dist/esm/utils/assert.d.ts +2 -1
  148. package/dist/esm/utils/assert.js +12 -5
  149. package/dist/esm/utils/assertSingleInstance.js +11 -17
  150. package/dist/esm/utils/debug.js +2 -1
  151. package/dist/esm/utils/getRandomId.d.ts +1 -1
  152. package/dist/esm/utils/getRandomId.js +1 -1
  153. package/dist/esm/utils/normalizeHeaders.js +1 -1
  154. package/dist/esm/utils/objectAssign.d.ts +1 -1
  155. package/dist/esm/utils/objectAssign.js +7 -2
  156. package/dist/esm/utils/parseUrl-extras.js +1 -0
  157. package/package.json +6 -3
  158. package/dist/cjs/shared/notSerializable.js +0 -5
  159. package/dist/cjs/utils/projectInfo.js +0 -8
  160. package/dist/esm/shared/notSerializable.d.ts +0 -1
  161. package/dist/esm/shared/notSerializable.js +0 -2
  162. package/dist/esm/utils/projectInfo.d.ts +0 -4
  163. package/dist/esm/utils/projectInfo.js +0 -5
@@ -20,7 +20,7 @@ function logWithVikeTag(msg, logType, category, showVikeVersion = false) {
20
20
  function getProjectTag(showVikeVersion) {
21
21
  let projectTag;
22
22
  if (showVikeVersion) {
23
- projectTag = `[vike@${utils_js_1.projectInfo.projectVersion}]`;
23
+ projectTag = `[vike@${utils_js_1.PROJECT_VERSION}]`;
24
24
  }
25
25
  else {
26
26
  projectTag = `[vike]`;
@@ -9,7 +9,7 @@ const resolvePrerenderConfig_js_1 = require("./resolvePrerenderConfig.js");
9
9
  const globalObject = (0, getGlobalObject_js_1.getGlobalObject)('prerender/context.ts', {});
10
10
  function isPrerenderAutoRunEnabled(vikeConfig) {
11
11
  const prerenderConfigGlobal = (0, resolvePrerenderConfig_js_1.resolvePrerenderConfigGlobal)(vikeConfig);
12
- return (prerenderConfigGlobal.isEnabled &&
12
+ return (prerenderConfigGlobal.isPrerenderingEnabled &&
13
13
  !(prerenderConfigGlobal || {}).disableAutoRun &&
14
14
  !globalObject.isDisabled &&
15
15
  vikeConfig.global.config.disableAutoFullBuild !== 'prerender');
@@ -4,28 +4,42 @@ exports.resolvePrerenderConfigGlobal = resolvePrerenderConfigGlobal;
4
4
  exports.resolvePrerenderConfigLocal = resolvePrerenderConfigLocal;
5
5
  const utils_js_1 = require("./utils.js");
6
6
  const getConfigValueBuildTime_js_1 = require("../../shared/page-configs/getConfigValueBuildTime.js");
7
+ // When setting +prerender to an object => it also enables pre-rendering
8
+ const defaultValueForObject = true;
7
9
  function resolvePrerenderConfigGlobal(vikeConfig) {
8
- const prerenderConfigs = vikeConfig.global.config.prerender;
9
- let prerenderConfigList = prerenderConfigs || [];
10
- // Needed because of backwards compatibility of `vike({prerender:true})` in `vite.config.js`; after we remove it we can remove this line.
11
- prerenderConfigList = prerenderConfigList.filter(isObject2);
12
- (0, utils_js_1.assert)(prerenderConfigList.every(isObject2)); // Help TS
10
+ const prerenderConfigs = vikeConfig.global.config.prerender || [];
11
+ const prerenderSettings = prerenderConfigs.filter(isObject2);
13
12
  const prerenderConfigGlobal = {
14
- partial: pickFirst(prerenderConfigList.map((c) => c.partial)) ?? false,
15
- noExtraDir: pickFirst(prerenderConfigList.map((c) => c.noExtraDir)) ?? false,
16
- parallel: pickFirst(prerenderConfigList.map((c) => c.parallel)) ?? true,
17
- disableAutoRun: pickFirst(prerenderConfigList.map((c) => c.disableAutoRun)) ?? false
13
+ partial: pickFirst(prerenderSettings.map((c) => c.partial)) ?? false,
14
+ noExtraDir: pickFirst(prerenderSettings.map((c) => c.noExtraDir)) ?? false,
15
+ parallel: pickFirst(prerenderSettings.map((c) => c.parallel)) ?? true,
16
+ disableAutoRun: pickFirst(prerenderSettings.map((c) => c.disableAutoRun)) ?? false
18
17
  };
19
- const prerenderConfigGlobalLocalValue = prerenderConfigList.map((c) => c.value).filter((v) => v !== null);
20
- const defaultLocalValue = pickFirst(prerenderConfigGlobalLocalValue) ??
21
- (prerenderConfigGlobalLocalValue.length > 0 ||
22
- // Backwards compatibility for with vike({ prerender: true }) in vite.config.js
23
- prerenderConfigs?.some((p) => p === true) ||
24
- false);
18
+ let defaultLocalValue = false;
19
+ {
20
+ const valueFirst = prerenderConfigs.filter((p) => !(0, utils_js_1.isObject)(p) || p.enable !== null)[0];
21
+ if (valueFirst === true || ((0, utils_js_1.isObject)(valueFirst) && (valueFirst.enable ?? defaultValueForObject))) {
22
+ defaultLocalValue = true;
23
+ }
24
+ }
25
+ // TODO/next-major: remove
26
+ // Backwards compatibility for `vike({prerender:true})` in vite.config.js
27
+ {
28
+ const valuesWithDefinedAt = vikeConfig.global._from.configsCumulative.prerender?.values ?? [];
29
+ if (valuesWithDefinedAt.some((v) => v.definedAt.includes('vite.config.js') && v.value)) {
30
+ defaultLocalValue = true;
31
+ }
32
+ }
25
33
  (0, utils_js_1.objectAssign)(prerenderConfigGlobal, {
26
34
  defaultLocalValue,
27
- isEnabled: defaultLocalValue || vikeConfig.pageConfigs.some((pageConfig) => resolvePrerenderConfigLocal(pageConfig)?.value)
35
+ isPrerenderingEnabledForAllPages: vikeConfig.pageConfigs.length > 0 &&
36
+ vikeConfig.pageConfigs.every((pageConfig) => resolvePrerenderConfigLocal(pageConfig)?.value ?? defaultLocalValue),
37
+ isPrerenderingEnabled: vikeConfig.pageConfigs.length > 0 &&
38
+ vikeConfig.pageConfigs.some((pageConfig) => resolvePrerenderConfigLocal(pageConfig)?.value ?? defaultLocalValue)
28
39
  });
40
+ // TODO/next-major remove
41
+ if (vikeConfig.pageConfigs.length === 0 && defaultLocalValue)
42
+ prerenderConfigGlobal.isPrerenderingEnabled = true;
29
43
  return prerenderConfigGlobal;
30
44
  }
31
45
  function resolvePrerenderConfigLocal(pageConfig) {
@@ -35,13 +49,14 @@ function resolvePrerenderConfigLocal(pageConfig) {
35
49
  const values = configValue.value;
36
50
  (0, utils_js_1.assert)((0, utils_js_1.isArray)(values));
37
51
  const value = values[0];
52
+ // If it's set to an object in a local config then Vike considers it a global config and it's skipped from local inheritance, thus we can assume the value to be a boolean.
38
53
  (0, utils_js_1.assert)(typeof value === 'boolean');
39
54
  (0, utils_js_1.assert)((0, utils_js_1.isArray)(configValue.definedAtData));
40
55
  const prerenderConfigLocal = { value };
41
56
  return prerenderConfigLocal;
42
57
  }
43
- function isObject2(p) {
44
- return typeof p === 'object' && p !== null;
58
+ function isObject2(value) {
59
+ return typeof value === 'object' && value !== null;
45
60
  }
46
61
  function pickFirst(arr) {
47
62
  return arr.filter((v) => v !== undefined)[0];
@@ -76,7 +76,7 @@ async function runPrerenderFromAPI(options = {}) {
76
76
  }
77
77
  async function runPrerenderFromCLIPrerenderCommand() {
78
78
  try {
79
- const { viteConfigEnhanced } = await (0, prepareViteApiCall_js_1.prepareViteApiCall)(undefined, 'prerender');
79
+ const { viteConfigEnhanced } = await (0, prepareViteApiCall_js_1.prepareViteApiCall)({}, 'prerender');
80
80
  await runPrerender({ viteConfig: viteConfigEnhanced }, '$ vike prerender');
81
81
  }
82
82
  catch (err) {
@@ -113,7 +113,7 @@ async function runPrerender(options = {}, standaloneTrigger) {
113
113
  (0, getHook_js_1.getHook_setIsPrerenderering)();
114
114
  const logLevel = !!options.onPagePrerender ? 'warn' : 'info';
115
115
  if (logLevel === 'info') {
116
- console.log(`${picocolors_1.default.cyan(`vike v${utils_js_1.projectInfo.projectVersion}`)} ${picocolors_1.default.green('pre-rendering HTML...')}`);
116
+ console.log(`${picocolors_1.default.cyan(`vike v${utils_js_1.PROJECT_VERSION}`)} ${picocolors_1.default.green('pre-rendering HTML...')}`);
117
117
  }
118
118
  await disableReactStreaming();
119
119
  const viteConfig = await (0, vite_1.resolveConfig)(options.viteConfig || {}, 'build', 'production');
@@ -122,13 +122,11 @@ async function runPrerender(options = {}, standaloneTrigger) {
122
122
  const { root } = viteConfig;
123
123
  const prerenderConfigGlobal = (0, resolvePrerenderConfig_js_1.resolvePrerenderConfigGlobal)(vikeConfig);
124
124
  validatePrerenderConfig(prerenderConfigGlobal);
125
- const { partial, noExtraDir, parallel, defaultLocalValue, isEnabled } = prerenderConfigGlobal;
126
- if (!isEnabled) {
125
+ const { partial, noExtraDir, parallel, defaultLocalValue, isPrerenderingEnabled } = prerenderConfigGlobal;
126
+ if (!isPrerenderingEnabled) {
127
127
  (0, utils_js_1.assert)(standaloneTrigger);
128
- // TODO/now: make it assertUsage() and remove dist/server/entry.mjs whenever possible
129
- (0, utils_js_1.assertWarning)(prerenderConfigGlobal, `You're executing ${picocolors_1.default.cyan(standaloneTrigger)} but you didn't enable pre-rendering. Use the config ${picocolors_1.default.cyan('prerender')} (${picocolors_1.default.underline('https://vike.dev/prerender')}) to enable it.`, {
130
- onlyOnce: true
131
- });
128
+ // TODO/now: make it assertUsage() and remove dist/server/entry.mjs if pre-rendering is completely disabled
129
+ (0, utils_js_1.assertWarning)(false, `You're executing ${picocolors_1.default.cyan(standaloneTrigger)} but you didn't enable pre-rendering. Use the ${picocolors_1.default.cyan('prerender')} setting (${picocolors_1.default.underline('https://vike.dev/prerender')}) to enable pre-rendering for at least one page.`, { onlyOnce: true });
132
130
  }
133
131
  const concurrencyLimit = (0, utils_js_1.pLimit)(parallel === false || parallel === 0 ? 1 : parallel === true || parallel === undefined ? (0, os_1.cpus)().length : parallel);
134
132
  await (0, globalContext_js_1.initGlobalContext_runPrerender)();
@@ -344,20 +342,16 @@ async function handlePagesWithStaticRoutes(prerenderContext, globalContext, doNo
344
342
  })));
345
343
  }
346
344
  async function createPageContext(urlOriginal, prerenderContext, globalContext) {
347
- const pageContext = {
345
+ const pageContextInit = { urlOriginal };
346
+ (0, utils_js_1.objectAssign)(pageContextInit, prerenderContext.pageContextInit);
347
+ const pageContext = await (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, globalContext, true, {});
348
+ (0, utils_js_1.assert)(pageContext.isPrerendering === true);
349
+ (0, utils_js_1.objectAssign)(pageContext, {
348
350
  _urlHandler: null,
349
351
  _urlRewrite: null,
350
352
  _noExtraDir: prerenderContext.noExtraDir,
351
353
  _prerenderContext: prerenderContext
352
- };
353
- const pageContextInit = {
354
- urlOriginal
355
- };
356
- (0, utils_js_1.objectAssign)(pageContextInit, prerenderContext.pageContextInit);
357
- {
358
- const pageContextInitEnhanced = await (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, globalContext);
359
- (0, utils_js_1.objectAssign)(pageContext, pageContextInitEnhanced);
360
- }
354
+ });
361
355
  return pageContext;
362
356
  }
363
357
  async function callOnPrerenderStartHook(prerenderContext, globalContext) {
@@ -18,7 +18,7 @@ const assertIsNotBrowser_js_1 = require("../../utils/assertIsNotBrowser.js");
18
18
  (0, assertIsNotBrowser_js_1.assertIsNotBrowser)();
19
19
  __exportStar(require("../../utils/assert.js"), exports);
20
20
  __exportStar(require("../../utils/hasProp.js"), exports);
21
- __exportStar(require("../../utils/projectInfo.js"), exports);
21
+ __exportStar(require("../../utils/PROJECT_VERSION.js"), exports);
22
22
  __exportStar(require("../../utils/objectAssign.js"), exports);
23
23
  __exportStar(require("../../utils/isObjectWithKeys.js"), exports);
24
24
  __exportStar(require("../../utils/isCallable.js"), exports);
@@ -92,9 +92,10 @@ function makePublic(globalContext) {
92
92
  async function setGlobalContext_viteDevServer(viteDevServer) {
93
93
  debug('setGlobalContext_viteDevServer()');
94
94
  setIsProduction(false);
95
- if (globalObject.viteDevServer)
96
- return;
97
- assertIsNotInitilizedYet();
95
+ // We cannot cache globalObject.viteDevServer because it's fully replaced when the user modifies vite.config.js => Vite's dev server is fully reloaded and a new viteDevServer replaces the previous one.
96
+ if (!globalObject.viteDevServer) {
97
+ assertIsNotInitilizedYet();
98
+ }
98
99
  (0, utils_js_1.assert)(globalObject.viteConfig);
99
100
  globalObject.viteDevServer = viteDevServer;
100
101
  await updateUserFiles();
@@ -354,7 +355,7 @@ function assertBuildInfo(buildInfo) {
354
355
  (0, utils_js_1.checkType)({ ...buildInfo, viteConfigRuntime: buildInfo.viteConfigRuntime });
355
356
  }
356
357
  function assertVersionAtBuildTime(versionAtBuildTime) {
357
- const versionAtRuntime = utils_js_1.projectInfo.projectVersion;
358
+ const versionAtRuntime = utils_js_1.PROJECT_VERSION;
358
359
  const pretty = (version) => picocolors_1.default.bold(`vike@${version}`);
359
360
  (0, utils_js_1.assertUsage)(versionAtBuildTime === versionAtRuntime, `Re-build your app (you're using ${pretty(versionAtRuntime)} but your app was built with ${pretty(versionAtBuildTime)})`);
360
361
  }
@@ -372,7 +373,7 @@ async function updateUserFiles() {
372
373
  const { promise, resolve } = (0, utils_js_1.genPromise)();
373
374
  (0, utils_js_1.assert)(!globalObject.isProduction);
374
375
  globalObject.waitForUserFilesUpdate = promise;
375
- const viteDevServer = getViteDevServer();
376
+ const { viteDevServer } = globalObject;
376
377
  (0, utils_js_1.assert)(viteDevServer);
377
378
  let virtualFileExports;
378
379
  try {
@@ -384,6 +385,9 @@ async function updateUserFiles() {
384
385
  }
385
386
  virtualFileExports = virtualFileExports.default || virtualFileExports;
386
387
  (0, utils_js_1.debugGlob)('Glob result: ', virtualFileExports);
388
+ // Avoid race condition: abort if there is a new globalObject.viteDevServer (happens when vite.config.js is modified => Vite's dev server is fully reloaded).
389
+ if (viteDevServer !== globalObject.viteDevServer)
390
+ return;
387
391
  await setUserFiles(virtualFileExports);
388
392
  resolve();
389
393
  }
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getViteDevScript = getViteDevScript;
7
7
  const utils_js_1 = require("../../utils.js");
8
8
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
9
+ const reachOutCTA = 'Create a new GitHub issue to discuss a solution.';
9
10
  async function getViteDevScript(pageContext) {
10
11
  const globalContext = pageContext._globalContext;
11
12
  if (globalContext.isProduction) {
@@ -17,11 +18,13 @@ async function getViteDevScript(pageContext) {
17
18
  let fakeHtml = fakeHtmlBegin + fakeHtmlEnd;
18
19
  fakeHtml = await viteDevServer.transformIndexHtml('/', fakeHtml);
19
20
  (0, utils_js_1.assertUsage)(!fakeHtml.includes('vite-plugin-pwa'), `The HTML transformer of ${picocolors_1.default.cyan('vite-plugin-pwa')} cannot be applied, see workaround at https://github.com/vikejs/vike/issues/388#issuecomment-1199280084`);
20
- (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');
21
- (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.');
21
+ (0, utils_js_1.assertUsage)(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), `Vite plugins that minify the HTML cannot be applied, see https://github.com/vikejs/vike/issues/224`);
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. ${reachOutCTA}`);
22
23
  const viteInjection = fakeHtml.slice(fakeHtmlBegin.length, -1 * fakeHtmlEnd.length);
23
24
  (0, utils_js_1.assert)(viteInjection.includes('script'));
24
- (0, utils_js_1.assertWarning)(!viteInjection.includes('import('), 'Unexpected Vite HMR code. Reach out to a Vike maintainer on GitHub.', { onlyOnce: true });
25
+ (0, utils_js_1.assertWarning)(!viteInjection.includes('import('), `Unexpected Vite injected HMR code. ${reachOutCTA}`, {
26
+ onlyOnce: true
27
+ });
25
28
  const viteDevScript = viteInjection;
26
29
  return viteDevScript;
27
30
  }
@@ -5,12 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.serializePageContextClientSide = serializePageContextClientSide;
7
7
  exports.serializePageContextAbort = serializePageContextAbort;
8
+ exports.getPropKeys = getPropKeys;
8
9
  const stringify_1 = require("@brillout/json-serializer/stringify");
9
10
  const utils_js_1 = require("../utils.js");
10
11
  const error_page_js_1 = require("../../../shared/error-page.js");
11
12
  const addIs404ToPageProps_js_1 = require("../../../shared/addIs404ToPageProps.js");
12
13
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
13
- const notSerializable_js_1 = require("../../../shared/notSerializable.js");
14
+ const NOT_SERIALIZABLE_js_1 = require("../../../shared/NOT_SERIALIZABLE.js");
14
15
  const pageContextInitIsPassedToClient_js_1 = require("../../../shared/misc/pageContextInitIsPassedToClient.js");
15
16
  const isServerSideError_js_1 = require("../../../shared/misc/isServerSideError.js");
16
17
  const PASS_TO_CLIENT = [
@@ -30,12 +31,8 @@ const PASS_TO_CLIENT = [
30
31
  const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isServerSideError_js_1.isServerSideError];
31
32
  function serializePageContextClientSide(pageContext) {
32
33
  const passToClient = getPassToClient(pageContext);
33
- const pageContextClient = {};
34
- passToClient.forEach((prop) => {
35
- // We set non-existing props to `undefined`, in order to pass the list of passToClient values to the client-side
36
- pageContextClient[prop] = pageContext[prop];
37
- });
38
- if (Object.keys(pageContext._pageContextInit).some((p) => passToClient.includes(p))) {
34
+ const pageContextClient = applyPassToClient(passToClient, pageContext);
35
+ if (passToClient.some((prop) => getPropVal(pageContext._pageContextInit, prop))) {
39
36
  pageContextClient[pageContextInitIsPassedToClient_js_1.pageContextInitIsPassedToClient] = true;
40
37
  }
41
38
  let pageContextSerialized;
@@ -47,14 +44,15 @@ function serializePageContextClientSide(pageContext) {
47
44
  let hasWarned = false;
48
45
  const propsNonSerializable = [];
49
46
  passToClient.forEach((prop) => {
50
- const propName1 = (0, utils_js_1.getPropAccessNotation)(prop);
51
- const propName2 = JSON.stringify(prop);
52
- const varName = `pageContext${propName1}`;
47
+ const res = getPropVal(pageContext, prop);
48
+ if (!res)
49
+ return;
50
+ const { value } = res;
51
+ const varName = `pageContext${getPropKeys(prop).map(utils_js_1.getPropAccessNotation).join('')}`;
53
52
  try {
54
- serialize(pageContext[prop], varName);
53
+ serialize(value, varName);
55
54
  }
56
55
  catch (err) {
57
- hasWarned = true;
58
56
  propsNonSerializable.push(prop);
59
57
  // useConfig() wrong usage
60
58
  if (prop === '_configFromHook') {
@@ -67,7 +65,7 @@ function serializePageContextClientSide(pageContext) {
67
65
  // Non-serializable pageContext set by the user
68
66
  let msg = [
69
67
  `${h(varName)} can't be serialized and, therefore, can't be passed to the client side.`,
70
- `Make sure ${h(varName)} is serializable, or remove ${h(propName2)} from ${h('passToClient')}.`
68
+ `Make sure ${h(varName)} is serializable, or remove ${h(JSON.stringify(prop))} from ${h('passToClient')}.`
71
69
  ].join(' ');
72
70
  if ((0, stringify_1.isJsonSerializerError)(err)) {
73
71
  msg = `${msg} Serialization error: ${err.messageCore}.`;
@@ -80,11 +78,12 @@ function serializePageContextClientSide(pageContext) {
80
78
  }
81
79
  // We warn (instead of throwing an error) since Vike's client runtime throws an error (with `assertUsage()`) if the user's client code tries to access the property that cannot be serialized
82
80
  (0, utils_js_1.assertWarning)(false, msg, { onlyOnce: false });
81
+ hasWarned = true;
83
82
  }
84
83
  });
85
84
  (0, utils_js_1.assert)(hasWarned);
86
85
  propsNonSerializable.forEach((prop) => {
87
- pageContextClient[prop] = notSerializable_js_1.notSerializable;
86
+ pageContextClient[getPropKeys(prop)[0]] = NOT_SERIALIZABLE_js_1.NOT_SERIALIZABLE;
88
87
  });
89
88
  try {
90
89
  pageContextSerialized = serialize(pageContextClient);
@@ -143,3 +142,57 @@ function serializePageContextAbort(pageContext) {
143
142
  }
144
143
  return serialize(pageContext);
145
144
  }
145
+ function applyPassToClient(passToClient, pageContext) {
146
+ const pageContextClient = {};
147
+ passToClient.forEach((prop) => {
148
+ // Get value from pageContext
149
+ const res = getPropVal(pageContext, prop);
150
+ if (!res)
151
+ return;
152
+ const { value } = res;
153
+ // Set value to pageContextClient
154
+ setPropVal(pageContextClient, prop, value);
155
+ });
156
+ return pageContextClient;
157
+ }
158
+ // Get a nested property from an object using a dot-separated path such as 'user.id'
159
+ function getPropVal(obj, prop) {
160
+ const keys = getPropKeys(prop);
161
+ let value = obj;
162
+ for (const key of keys) {
163
+ if ((0, utils_js_1.isObject)(value) && key in value) {
164
+ value = value[key];
165
+ }
166
+ else {
167
+ return null; // Property or intermediate property doesn't exist
168
+ }
169
+ }
170
+ return { value };
171
+ }
172
+ // Set a nested property in an object using a dot-separated path such as 'user.id'
173
+ function setPropVal(obj, prop, val) {
174
+ const keys = getPropKeys(prop);
175
+ let currentObj = obj;
176
+ // Creating intermediate objects if necessary
177
+ for (let i = 0; i <= keys.length - 2; i++) {
178
+ const key = keys[i];
179
+ if (!(key in currentObj)) {
180
+ // Create intermediate object
181
+ currentObj[key] = {};
182
+ }
183
+ if (!(0, utils_js_1.isObject)(currentObj[key])) {
184
+ // Skip value upon data structure conflict
185
+ return;
186
+ }
187
+ currentObj = currentObj[key];
188
+ }
189
+ // Set the final key to the value
190
+ const finalKey = keys[keys.length - 1];
191
+ currentObj[finalKey] = val;
192
+ }
193
+ function getPropKeys(prop) {
194
+ // Like `prop.split('.')` but with added support for `\` escaping, see serializePageContextClientSide.spec.ts
195
+ return prop
196
+ .split(/(?<!\\)\./) // Split on unescaped dots
197
+ .map((key) => key.replace(/\\\./g, '.')); // Replace escaped dots with literal dots
198
+ }
@@ -164,6 +164,13 @@ function getStreamReadableWeb(htmlRender) {
164
164
  if (isStreamReadableWeb(htmlRender)) {
165
165
  return htmlRender;
166
166
  }
167
+ if (isStreamPipeWeb(htmlRender)) {
168
+ const streamPipeWeb = getStreamPipeWeb(htmlRender);
169
+ (0, utils_js_1.assert)(streamPipeWeb);
170
+ const { readable, writable } = new TransformStream();
171
+ streamPipeWeb(writable);
172
+ return readable;
173
+ }
167
174
  return null;
168
175
  }
169
176
  function pipeToStreamWritableWeb(htmlRender, writable) {
@@ -9,20 +9,29 @@ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
9
9
  const globalObject = (0, utils_js_1.getGlobalObject)('createHttpResponse/assertNoInfiniteHttpRedirect.ts', {
10
10
  redirectGraph: {}
11
11
  });
12
- function assertNoInfiniteHttpRedirect(urlRedirectTarget, urlLogical) {
12
+ function assertNoInfiniteHttpRedirect(
13
+ // The exact URL that the user will be redirected to.
14
+ // - It includes the Base URL as well as the locale (i18n) base.
15
+ urlRedirectTarget,
16
+ // Rationale for checking against `pageContextInit.urlOriginal`: https://github.com/vikejs/vike/pull/2264#issuecomment-2713890263
17
+ pageContextInit) {
18
+ // TO-DO/eventually: use cookie as described at https://github.com/vikejs/vike/pull/2273
19
+ if (true)
20
+ return 'DISABLED'; // Disabled until we make it reliable.
13
21
  if (!urlRedirectTarget.startsWith('/')) {
14
- // We assume that urlRedirectTarget points to an origin that is external (not the same origin), and we can therefore assume that the app doesn't define an infinite loop (in itself).
15
- // - There isn't a reliable way to check whether the redirect points to an external origin or the same origin. For same origins, we assume/hope the user to pass the URL without origin.
22
+ // We assume that urlRedirectTarget points to an origin that is external (not the same origin), and we can therefore assume that the app doesn't define an infinite loop (at least not in itself).
23
+ // - There isn't a reliable way to check whether the redirect points to an external origin or the same origin; we hope/assume the user sets the URL without origin.
16
24
  // ```js
17
25
  // // For same-origin, the user usually/hopefully passes a URL without origin
18
26
  // renderPage({ urlOriginal: '/some/pathname' })
19
27
  // ```
20
28
  return;
21
29
  }
22
- (0, utils_js_1.assert)(urlLogical.startsWith('/'));
30
+ const urlOriginalNormalized = (0, utils_js_1.removeUrlOrigin)(pageContextInit.urlOriginal).urlModified;
31
+ (0, utils_js_1.assert)(urlOriginalNormalized.startsWith('/'));
23
32
  const graph = copy(globalObject.redirectGraph);
24
33
  graph[urlRedirectTarget] ?? (graph[urlRedirectTarget] = new Set());
25
- graph[urlRedirectTarget].add(urlLogical);
34
+ graph[urlRedirectTarget].add(urlOriginalNormalized);
26
35
  validate(graph);
27
36
  globalObject.redirectGraph = graph;
28
37
  }
@@ -84,10 +84,8 @@ async function createHttpResponsePageContextJson(pageContextSerialized) {
84
84
  const httpResponse = createHttpResponse(200, 'application/json', [], pageContextSerialized, [], null);
85
85
  return httpResponse;
86
86
  }
87
- function createHttpResponseRedirect({ url, statusCode },
88
- // The URL we assume the redirect to be logically based on
89
- urlLogical) {
90
- (0, assertNoInfiniteHttpRedirect_js_1.assertNoInfiniteHttpRedirect)(url, urlLogical);
87
+ function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
88
+ (0, assertNoInfiniteHttpRedirect_js_1.assertNoInfiniteHttpRedirect)(url, pageContextInit);
91
89
  (0, utils_js_1.assert)(url);
92
90
  (0, utils_js_1.assert)(statusCode);
93
91
  (0, utils_js_1.assert)(300 <= statusCode && statusCode <= 399);
@@ -27,6 +27,10 @@ const errorsMisc = [
27
27
  errMsg: 'assets.json',
28
28
  link: 'https://vike.dev/getGlobalContext',
29
29
  mustMentionNodeModules: false
30
+ },
31
+ {
32
+ errMsg: 'ERR_UNKNOWN_FILE_EXTENSION',
33
+ link: 'https://vike.dev/broken-npm-package#err-unknown-file-extension'
30
34
  }
31
35
  ];
32
36
  const reactInvalidEelement = 'https://vike.dev/broken-npm-package#react-invalid-component';
@@ -77,7 +81,8 @@ const errorsCjsEsm = [
77
81
  { errMsg: 'exports is not defined' },
78
82
  { errMsg: 'module is not defined' },
79
83
  { errMsg: 'not defined in ES' },
80
- { errMsg: "Unexpected token 'export'" }
84
+ { errMsg: "Unexpected token 'export'" },
85
+ { errMsg: 'Failed to resolve entry for package' }
81
86
  ];
82
87
  function logErrorHint(error) {
83
88
  /* Collect errors for ./logErrorHint.spec.ts
@@ -9,5 +9,8 @@ function preparePageContextForUserConsumptionServerSide(pageContext) {
9
9
  (0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(pageContext.routeParams));
10
10
  (0, utils_js_1.assert)('Page' in pageContext);
11
11
  (0, utils_js_1.assert)(typeof pageContext.isClientSideNavigation === 'boolean');
12
+ (0, utils_js_1.assert)(pageContext._isPageContextObject);
13
+ (0, utils_js_1.assert)(pageContext.isClientSide === false);
14
+ (0, utils_js_1.assert)(typeof pageContext.isPrerendering === 'boolean');
12
15
  (0, preparePageContextForUserConsumption_js_1.preparePageContextForUserConsumption)(pageContext);
13
16
  }
@@ -7,6 +7,7 @@ exports.renderPageAlreadyRouted = renderPageAlreadyRouted;
7
7
  exports.prerenderPage = prerenderPage;
8
8
  exports.prerender404Page = prerender404Page;
9
9
  exports.getPageContextInitEnhanced = getPageContextInitEnhanced;
10
+ exports.createPageContext = createPageContext;
10
11
  const error_page_js_1 = require("../../../shared/error-page.js");
11
12
  const renderHtml_js_1 = require("../html/renderHtml.js");
12
13
  const utils_js_1 = require("../utils.js");
@@ -89,7 +90,11 @@ async function prerender404Page(pageContextInit_, globalContext) {
89
90
  if (!errorPageId) {
90
91
  return null;
91
92
  }
92
- const pageContext = {
93
+ // A URL is required for `viteDevServer.transformIndexHtml(url,html)`
94
+ const pageContextInit = { urlOriginal: '/fake-404-url' };
95
+ (0, utils_js_1.objectAssign)(pageContextInit, pageContextInit_);
96
+ const pageContext = await getPageContextInitEnhanced(pageContextInit, globalContext, true);
97
+ (0, utils_js_1.objectAssign)(pageContext, {
93
98
  pageId: errorPageId,
94
99
  _httpRequestId: null,
95
100
  _urlRewrite: null,
@@ -98,25 +103,17 @@ async function prerender404Page(pageContextInit_, globalContext) {
98
103
  // `prerender404Page()` is about generating `dist/client/404.html` for static hosts; there is no Client Routing.
99
104
  _usesClientRouter: false,
100
105
  _debugRouteMatches: []
101
- };
102
- const pageContextInit = {
103
- urlOriginal: '/fake-404-url' // A URL is needed for `applyViteHtmlTransform`
104
- };
105
- (0, utils_js_1.objectAssign)(pageContextInit, pageContextInit_);
106
- {
107
- const pageContextInitEnhanced = await getPageContextInitEnhanced(pageContextInit, globalContext);
108
- (0, utils_js_1.objectAssign)(pageContext, pageContextInitEnhanced);
109
- }
106
+ });
110
107
  (0, utils_js_1.objectAssign)(pageContext, await (0, loadUserFilesServerSide_js_1.loadUserFilesServerSide)(pageContext));
111
108
  return prerenderPage(pageContext);
112
109
  }
113
- async function getPageContextInitEnhanced(pageContextInit, globalContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
110
+ async function getPageContextInitEnhanced(pageContextInit, globalContext, isPrerendering, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
114
111
  urlRewrite: null,
115
112
  urlHandler: null,
116
113
  isClientSideNavigation: false
117
114
  } } = {}) {
118
115
  (0, utils_js_1.assert)(pageContextInit.urlOriginal);
119
- const pageContextInitEnhanced = {};
116
+ const pageContextInitEnhanced = createPageContext(pageContextInit, isPrerendering);
120
117
  (0, utils_js_1.objectAssign)(pageContextInitEnhanced, pageContextInit);
121
118
  (0, utils_js_1.objectAssign)(pageContextInitEnhanced, {
122
119
  _objectCreatedByVike: true,
@@ -163,3 +160,12 @@ async function getPageContextInitEnhanced(pageContextInit, globalContext, { ssr:
163
160
  }
164
161
  return pageContextInitEnhanced;
165
162
  }
163
+ function createPageContext(pageContextInit, isPrerendering) {
164
+ const pageContext = {
165
+ _isPageContextObject: true,
166
+ isClientSide: false,
167
+ isPrerendering
168
+ };
169
+ (0, utils_js_1.objectAssign)(pageContext, pageContextInit);
170
+ return pageContext;
171
+ }