vike 0.4.218 → 0.4.220-commit-a9f46b8

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 (211) hide show
  1. package/dist/cjs/__internal/index.js +11 -11
  2. package/dist/cjs/node/api/build.js +22 -48
  3. package/dist/cjs/node/api/context.js +8 -6
  4. package/dist/cjs/node/api/index.js +17 -7
  5. package/dist/cjs/node/api/prepareViteApiCall.js +40 -13
  6. package/dist/cjs/node/cli/context.js +16 -0
  7. package/dist/cjs/node/cli/entry.js +21 -7
  8. package/dist/cjs/node/cli/utils.js +1 -0
  9. package/dist/cjs/node/plugin/index.js +5 -5
  10. package/dist/cjs/node/plugin/plugins/autoFullBuild.js +32 -20
  11. package/dist/cjs/node/plugin/plugins/baseUrls.js +3 -10
  12. package/dist/cjs/node/plugin/plugins/buildConfig.js +2 -2
  13. package/dist/cjs/node/plugin/plugins/{importBuild → buildEntry}/index.js +16 -17
  14. package/dist/cjs/node/plugin/plugins/commonConfig.js +41 -4
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +26 -23
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +171 -68
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +1 -1
  18. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +7 -5
  19. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +1 -1
  20. package/dist/cjs/node/plugin/plugins/{vite6HmrRegressionWorkaround.js → workaroundVite6HmrRegression.js} +3 -3
  21. package/dist/cjs/node/plugin/shared/getHttpRequestAsyncStore.js +17 -7
  22. package/dist/cjs/node/prerender/context.js +24 -0
  23. package/dist/cjs/node/prerender/runPrerender.js +146 -96
  24. package/dist/cjs/node/prerender/utils.js +2 -0
  25. package/dist/cjs/node/runtime/globalContext.js +109 -55
  26. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +2 -2
  27. package/dist/cjs/node/runtime/index-common.js +0 -15
  28. package/dist/cjs/node/runtime/onLoad.js +17 -3
  29. package/dist/cjs/node/runtime/page-files/setup.js +2 -4
  30. package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -2
  31. package/dist/cjs/node/runtime/renderPage/createHttpResponse/getCacheControl.js +2 -2
  32. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +1 -1
  33. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -33
  34. package/dist/cjs/node/runtime/renderPage/resolveRedirects.js +9 -1
  35. package/dist/cjs/node/runtime/renderPage.js +21 -22
  36. package/dist/cjs/node/runtime/utils.js +2 -0
  37. package/dist/cjs/node/runtime-dev/index.js +17 -7
  38. package/dist/cjs/node/shared/assertRuntimeManifest.js +0 -2
  39. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +3 -3
  40. package/dist/cjs/shared/getPageFiles/{setPageFiles.js → getPageFiles.js} +8 -6
  41. package/dist/cjs/shared/getPageFiles.js +3 -9
  42. package/dist/cjs/shared/hooks/getHook.js +3 -3
  43. package/dist/cjs/shared/{getPageFiles/getExports.js → page-configs/getPageConfigUserFriendly.js} +113 -81
  44. package/dist/cjs/shared/page-configs/loadConfigValues.js +5 -1
  45. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +80 -55
  46. package/dist/cjs/shared/route/loadPageRoutes.js +3 -3
  47. package/dist/cjs/shared/utils.js +1 -0
  48. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  49. package/dist/cjs/utils/assert.js +4 -3
  50. package/dist/cjs/utils/assertSetup.js +47 -16
  51. package/dist/cjs/utils/catchInfiniteLoop.js +34 -0
  52. package/dist/cjs/utils/debug.js +11 -6
  53. package/dist/cjs/utils/getGlobalObject.js +1 -2
  54. package/dist/cjs/utils/isDev.js +2 -0
  55. package/dist/cjs/utils/makePublicCopy.js +32 -0
  56. package/dist/cjs/utils/objectReplace.js +9 -0
  57. package/dist/esm/__internal/index.d.ts +3 -5
  58. package/dist/esm/__internal/index.js +6 -8
  59. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -1
  60. package/dist/esm/client/client-routing-runtime/entry.d.ts +1 -1
  61. package/dist/esm/client/client-routing-runtime/entry.js +0 -1
  62. package/dist/esm/client/client-routing-runtime/getPageContextCurrent.d.ts +2 -2
  63. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +4 -4
  64. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +1 -1
  65. package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
  66. package/dist/esm/client/client-routing-runtime/history.js +23 -18
  67. package/dist/esm/client/client-routing-runtime/index.d.ts +0 -1
  68. package/dist/esm/client/client-routing-runtime/index.js +0 -1
  69. package/dist/esm/client/client-routing-runtime/initClientRouter.js +2 -2
  70. package/dist/esm/client/client-routing-runtime/initOnLinkClick.js +3 -4
  71. package/dist/esm/client/client-routing-runtime/initOnPopState.d.ts +0 -10
  72. package/dist/esm/client/client-routing-runtime/initOnPopState.js +50 -62
  73. package/dist/esm/client/client-routing-runtime/prefetch/getPrefetchSettings.d.ts +2 -2
  74. package/dist/esm/client/client-routing-runtime/prefetch.d.ts +2 -2
  75. package/dist/esm/client/client-routing-runtime/prefetch.js +2 -2
  76. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +15 -15
  77. package/dist/esm/client/client-routing-runtime/scrollRestoration.d.ts +4 -6
  78. package/dist/esm/client/client-routing-runtime/scrollRestoration.js +17 -12
  79. package/dist/esm/client/client-routing-runtime/setScrollPosition.d.ts +1 -1
  80. package/dist/esm/client/client-routing-runtime/setScrollPosition.js +29 -5
  81. package/dist/esm/client/client-routing-runtime/utils.d.ts +1 -0
  82. package/dist/esm/client/client-routing-runtime/utils.js +1 -0
  83. package/dist/esm/client/server-routing-runtime/entry.d.ts +1 -1
  84. package/dist/esm/client/server-routing-runtime/entry.js +0 -1
  85. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +1 -1
  86. package/dist/esm/client/server-routing-runtime/getPageContext.js +5 -2
  87. package/dist/esm/client/shared/executeOnRenderClientHook.d.ts +2 -2
  88. package/dist/esm/client/shared/loadUserFilesClientSide.d.ts +2 -2
  89. package/dist/esm/client/shared/loadUserFilesClientSide.js +2 -2
  90. package/dist/esm/client/shared/normalizeClientSideUrl.js +2 -3
  91. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +2 -2
  92. package/dist/esm/node/api/build.d.ts +1 -6
  93. package/dist/esm/node/api/build.js +20 -26
  94. package/dist/esm/node/api/context.d.ts +4 -2
  95. package/dist/esm/node/api/context.js +8 -7
  96. package/dist/esm/node/api/prepareViteApiCall.d.ts +0 -1
  97. package/dist/esm/node/api/prepareViteApiCall.js +26 -9
  98. package/dist/esm/node/cli/context.d.ts +5 -0
  99. package/dist/esm/node/cli/context.js +14 -0
  100. package/dist/esm/node/cli/entry.js +4 -0
  101. package/dist/esm/node/cli/parseCli.d.ts +3 -1
  102. package/dist/esm/node/cli/utils.d.ts +1 -0
  103. package/dist/esm/node/cli/utils.js +1 -0
  104. package/dist/esm/node/plugin/index.d.ts +1 -1
  105. package/dist/esm/node/plugin/index.js +5 -5
  106. package/dist/esm/node/plugin/plugins/autoFullBuild.js +32 -20
  107. package/dist/esm/node/plugin/plugins/baseUrls.d.ts +1 -1
  108. package/dist/esm/node/plugin/plugins/baseUrls.js +4 -11
  109. package/dist/esm/node/plugin/plugins/buildConfig.js +2 -2
  110. package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/getVikeManifest.d.ts +1 -1
  111. package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/index.d.ts +2 -2
  112. package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/index.js +16 -17
  113. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +10 -1
  114. package/dist/esm/node/plugin/plugins/commonConfig.js +42 -5
  115. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.d.ts +1 -1
  116. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +6 -9
  117. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +25 -22
  118. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +96 -1
  119. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +167 -64
  120. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +1 -1
  121. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +7 -5
  122. package/dist/esm/node/plugin/plugins/setGlobalContext.js +1 -1
  123. package/dist/esm/node/plugin/plugins/workaroundVite6HmrRegression.d.ts +3 -0
  124. package/dist/esm/node/plugin/plugins/{vite6HmrRegressionWorkaround.js → workaroundVite6HmrRegression.js} +3 -3
  125. package/dist/esm/node/prerender/context.d.ts +9 -0
  126. package/dist/esm/node/prerender/context.js +22 -0
  127. package/dist/esm/node/prerender/runPrerender.d.ts +42 -2
  128. package/dist/esm/node/prerender/runPrerender.js +130 -90
  129. package/dist/esm/node/prerender/utils.d.ts +2 -0
  130. package/dist/esm/node/prerender/utils.js +2 -0
  131. package/dist/esm/node/runtime/globalContext.d.ts +23 -7
  132. package/dist/esm/node/runtime/globalContext.js +109 -55
  133. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +1 -1
  134. package/dist/esm/node/runtime/index-common.d.ts +0 -1
  135. package/dist/esm/node/runtime/index-common.js +0 -15
  136. package/dist/esm/node/runtime/index-deprecated.d.ts +1 -0
  137. package/dist/esm/node/runtime/onLoad.js +16 -2
  138. package/dist/esm/node/runtime/page-files/setup.js +3 -3
  139. package/dist/esm/node/runtime/renderPage/analyzePage.js +1 -1
  140. package/dist/esm/node/runtime/renderPage/createHttpResponse/getCacheControl.js +1 -1
  141. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +2 -2
  142. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -1
  143. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +2 -2
  144. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  145. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +31 -46
  146. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -33
  147. package/dist/esm/node/runtime/renderPage/resolveRedirects.d.ts +1 -1
  148. package/dist/esm/node/runtime/renderPage/resolveRedirects.js +9 -1
  149. package/dist/esm/node/runtime/renderPage.js +22 -23
  150. package/dist/esm/node/runtime/utils.d.ts +2 -0
  151. package/dist/esm/node/runtime/utils.js +2 -0
  152. package/dist/esm/node/shared/assertPluginManifest.d.ts +0 -1
  153. package/dist/esm/node/shared/assertRuntimeManifest.d.ts +0 -1
  154. package/dist/esm/node/shared/assertRuntimeManifest.js +1 -3
  155. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +1 -1
  156. package/dist/esm/shared/getPageFiles/{setPageFiles.d.ts → getPageFiles.d.ts} +3 -1
  157. package/dist/esm/shared/getPageFiles/{setPageFiles.js → getPageFiles.js} +8 -6
  158. package/dist/esm/shared/getPageFiles.d.ts +2 -5
  159. package/dist/esm/shared/getPageFiles.js +1 -4
  160. package/dist/esm/shared/hooks/getHook.d.ts +3 -3
  161. package/dist/esm/shared/hooks/getHook.js +1 -1
  162. package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +9 -5
  163. package/dist/esm/shared/page-configs/Config.d.ts +20 -2
  164. package/dist/esm/shared/page-configs/PageConfig.d.ts +13 -6
  165. package/dist/esm/shared/{getPageFiles/getExports.d.ts → page-configs/getPageConfigUserFriendly.d.ts} +26 -12
  166. package/dist/esm/shared/{getPageFiles/getExports.js → page-configs/getPageConfigUserFriendly.js} +112 -80
  167. package/dist/esm/shared/page-configs/loadConfigValues.js +6 -2
  168. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +26 -6
  169. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +80 -55
  170. package/dist/esm/shared/route/executeGuardHook.d.ts +2 -2
  171. package/dist/esm/shared/route/loadPageRoutes.js +1 -1
  172. package/dist/esm/shared/types.d.ts +1 -1
  173. package/dist/esm/shared/utils.d.ts +1 -0
  174. package/dist/esm/shared/utils.js +1 -0
  175. package/dist/esm/types/index.d.ts +1 -1
  176. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  177. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  178. package/dist/esm/utils/assert.js +4 -3
  179. package/dist/esm/utils/assertSetup.js +47 -16
  180. package/dist/esm/utils/catchInfiniteLoop.d.ts +2 -0
  181. package/dist/esm/utils/catchInfiniteLoop.js +32 -0
  182. package/dist/esm/utils/debug.d.ts +1 -1
  183. package/dist/esm/utils/debug.js +11 -6
  184. package/dist/esm/utils/getGlobalObject.js +1 -2
  185. package/dist/esm/utils/isDev.js +2 -0
  186. package/dist/esm/utils/makePublicCopy.d.ts +3 -0
  187. package/dist/esm/utils/makePublicCopy.js +30 -0
  188. package/dist/esm/utils/objectReplace.d.ts +1 -0
  189. package/dist/esm/utils/objectReplace.js +6 -0
  190. package/dist/esm/utils/projectInfo.d.ts +1 -1
  191. package/package.json +4 -13
  192. package/__internal/loadImportBuild.js +0 -3
  193. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveVikeConfigGlobal.js +0 -128
  194. package/dist/cjs/node/runtime/globalContext/loadImportBuild.js +0 -25
  195. package/dist/cjs/node/runtime/page-files/getPageFilesExports.js +0 -22
  196. package/dist/esm/client/client-routing-runtime/pageFiles.d.ts +0 -1
  197. package/dist/esm/client/client-routing-runtime/pageFiles.js +0 -4
  198. package/dist/esm/client/server-routing-runtime/pageFiles.d.ts +0 -1
  199. package/dist/esm/client/server-routing-runtime/pageFiles.js +0 -4
  200. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveVikeConfigGlobal.d.ts +0 -104
  201. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveVikeConfigGlobal.js +0 -123
  202. package/dist/esm/node/plugin/plugins/vite6HmrRegressionWorkaround.d.ts +0 -3
  203. package/dist/esm/node/runtime/globalContext/loadImportBuild.d.ts +0 -18
  204. package/dist/esm/node/runtime/globalContext/loadImportBuild.js +0 -23
  205. package/dist/esm/node/runtime/page-files/getPageFilesExports.d.ts +0 -2
  206. package/dist/esm/node/runtime/page-files/getPageFilesExports.js +0 -20
  207. /package/dist/cjs/node/plugin/plugins/{importBuild → buildEntry}/getVikeManifest.js +0 -0
  208. /package/dist/cjs/shared/page-configs/{getConfigValue.js → getConfigValueRuntime.js} +0 -0
  209. /package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/getVikeManifest.js +0 -0
  210. /package/dist/esm/shared/page-configs/{getConfigValue.d.ts → getConfigValueRuntime.d.ts} +0 -0
  211. /package/dist/esm/shared/page-configs/{getConfigValue.js → getConfigValueRuntime.js} +0 -0
@@ -5,7 +5,8 @@ import { getVikeConfig } from './getVikeConfig.js';
5
5
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
6
6
  import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
7
7
  async function getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRouting, config) {
8
- const { pageConfigs, pageConfigGlobal } = await getVikeConfig(config, { doNotRestartViteOnError: true });
8
+ const vikeConfig = await getVikeConfig(config, { doNotRestartViteOnError: true });
9
+ const { pageConfigs, pageConfigGlobal } = vikeConfig;
9
10
  return getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting);
10
11
  }
11
12
  function getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting) {
@@ -25,14 +26,15 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
25
26
  const lines = [];
26
27
  pageConfigs.forEach((pageConfig) => {
27
28
  const { pageId, routeFilesystem, isErrorPage } = pageConfig;
28
- const virtualFileIdPageConfigValuesAll = getVirtualFileIdPageConfigValuesAll(pageId, isForClientSide);
29
29
  lines.push(` {`);
30
30
  lines.push(` pageId: ${JSON.stringify(pageId)},`);
31
31
  lines.push(` isErrorPage: ${JSON.stringify(isErrorPage)},`);
32
32
  lines.push(` routeFilesystem: ${JSON.stringify(routeFilesystem)},`);
33
- lines.push(` loadConfigValuesAll: () => import(${JSON.stringify(virtualFileIdPageConfigValuesAll)}),`);
33
+ const virtualFileId = JSON.stringify(getVirtualFileIdPageConfigValuesAll(pageId, isForClientSide));
34
+ const load = `() => ({ moduleId: ${virtualFileId}, moduleExports: import(${virtualFileId}) })`;
35
+ lines.push(` loadConfigValuesAll: ${load},`);
34
36
  lines.push(` configValuesSerialized: {`);
35
- lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isDev }), { isEager: true }, ' '));
37
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isDev }), ' ', true));
36
38
  lines.push(` },`);
37
39
  lines.push(` },`);
38
40
  });
@@ -42,7 +44,7 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
42
44
  function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements) {
43
45
  const lines = [];
44
46
  lines.push(` configValuesSerialized: {`);
45
- lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isDev }), { isEager: true }, ' '));
47
+ lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isDev }), ' ', null));
46
48
  lines.push(` },`);
47
49
  const code = lines.join('\n');
48
50
  return code;
@@ -33,7 +33,7 @@ function setGlobalContext() {
33
33
  order: 'post',
34
34
  async handler(config) {
35
35
  const { outDirRoot } = getOutDirs(config);
36
- assertFilePathAbsoluteFilesystem(outDirRoot); // Needed for loadImportBuild(outDir) of @brillout/vite-plugin-server-entry
36
+ assertFilePathAbsoluteFilesystem(outDirRoot); // Needed for `importServerProductionEntry({ outDir })` of @brillout/vite-plugin-server-entry
37
37
  setGlobalContext_viteConfig(config, outDirRoot);
38
38
  const vikeConfig = await getVikeConfig(config);
39
39
  setGlobalContext_vikeConfig(vikeConfig);
@@ -0,0 +1,3 @@
1
+ export { workaroundVite6HmrRegression };
2
+ import type { Plugin } from 'vite';
3
+ declare function workaroundVite6HmrRegression(): Plugin;
@@ -1,11 +1,11 @@
1
- export { vite6HmrRegressionWorkaround };
1
+ export { workaroundVite6HmrRegression };
2
2
  // https://vite.dev/guide/migration (will be 404 after vite@7 release) > search for `hmrReload()`
3
3
  // https://v6.vite.dev/guide/migration (will exist after vite@7 release) > search for `hmrReload()`
4
4
  // Workaround seems to work for docs page /banner (which is HTML-only)
5
5
  // But doesn't seem to work for /examples/render-modes/ (see https://github.com/vikejs/vike/pull/2069 commit `renable HMR test for HTML-only`)
6
- function vite6HmrRegressionWorkaround() {
6
+ function workaroundVite6HmrRegression() {
7
7
  return {
8
- name: 'vike:vite6HmrRegressionWorkaround',
8
+ name: 'vike:workaroundVite6HmrRegression',
9
9
  enforce: 'post',
10
10
  hotUpdate: {
11
11
  order: 'post',
@@ -0,0 +1,9 @@
1
+ export { isPrerenderAutoRunEnabled };
2
+ export { temp_disablePrerenderAutoRun };
3
+ export { isPrerendering };
4
+ export { setContextIsPrerendering };
5
+ import type { VikeConfigGlobal } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
6
+ declare function isPrerenderAutoRunEnabled(vikeConfigGlobal: VikeConfigGlobal): boolean;
7
+ declare function temp_disablePrerenderAutoRun(): void;
8
+ declare function isPrerendering(): boolean;
9
+ declare function setContextIsPrerendering(): void;
@@ -0,0 +1,22 @@
1
+ export { isPrerenderAutoRunEnabled };
2
+ export { temp_disablePrerenderAutoRun };
3
+ export { isPrerendering };
4
+ export { setContextIsPrerendering };
5
+ import { getGlobalObject } from '../../utils/getGlobalObject.js';
6
+ const globalObject = getGlobalObject('prerender/context.ts', {});
7
+ function isPrerenderAutoRunEnabled(vikeConfigGlobal) {
8
+ return (vikeConfigGlobal.prerender &&
9
+ !vikeConfigGlobal.prerender.disableAutoRun &&
10
+ !globalObject.isDisabled &&
11
+ vikeConfigGlobal.disableAutoFullBuild !== 'prerender');
12
+ }
13
+ // TODO/v1-release: remove
14
+ function temp_disablePrerenderAutoRun() {
15
+ globalObject.isDisabled = true;
16
+ }
17
+ function isPrerendering() {
18
+ return !!globalObject.isPrerendering;
19
+ }
20
+ function setContextIsPrerendering() {
21
+ globalObject.isPrerendering = true;
22
+ }
@@ -3,9 +3,47 @@ export { runPrerenderFromCLIPrerenderCommand };
3
3
  export { runPrerenderFromAutoRun };
4
4
  export { runPrerender_forceExit };
5
5
  export type { PrerenderOptions };
6
- import '../runtime/page-files/setup.js';
6
+ export type { PrerenderContextPublic };
7
+ import { PageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
7
8
  import type { InlineConfig, ResolvedConfig } from 'vite';
9
+ import { PageContextUrlInternal } from '../../shared/getPageContextUrlComputed.js';
8
10
  import type { APIOptions } from '../api/types.js';
11
+ type ProvidedByHook = null | {
12
+ hookFilePath: string;
13
+ hookName: 'onBeforePrerenderStart' | 'prerender';
14
+ };
15
+ type TransformerHook = {
16
+ hookFilePath: string;
17
+ hookName: 'onPrerenderStart' | 'onBeforePrerender';
18
+ };
19
+ type PageContextPrerendered = {
20
+ urlOriginal: string;
21
+ _providedByHook?: ProvidedByHook;
22
+ };
23
+ type PrerenderedPageContexts = Record<string, PageContextPrerendered>;
24
+ type PrerenderContext = {
25
+ pageContexts: PageContext[];
26
+ pageContextInit: Record<string, unknown> | null;
27
+ noExtraDir: boolean;
28
+ prerenderedPageContexts: PrerenderedPageContexts;
29
+ output: Output;
30
+ };
31
+ type Output = {
32
+ filePath: string;
33
+ fileType: FileType;
34
+ fileContent: string;
35
+ pageContext: PageContextPrerendered;
36
+ }[];
37
+ type FileType = 'HTML' | 'JSON';
38
+ type PrerenderContextPublic = Pick<PrerenderContext, 'pageContexts'>;
39
+ type PageContext = PageContextInitEnhanced & {
40
+ _urlRewrite: null;
41
+ _urlHandler: null;
42
+ _urlOriginalBeforeHook?: string;
43
+ _urlOriginalModifiedByHook?: TransformerHook;
44
+ _providedByHook: ProvidedByHook;
45
+ _pageContextAlreadyProvidedByOnPrerenderHook?: true;
46
+ } & PageContextUrlInternal;
9
47
  type PrerenderOptions = APIOptions & {
10
48
  /** Initial `pageContext` values */
11
49
  pageContextInit?: Record<string, unknown>;
@@ -30,5 +68,7 @@ declare function runPrerenderFromAPI(options?: PrerenderOptions): Promise<{
30
68
  viteConfig: ResolvedConfig;
31
69
  }>;
32
70
  declare function runPrerenderFromCLIPrerenderCommand(): Promise<void>;
33
- declare function runPrerenderFromAutoRun(viteConfig: InlineConfig | undefined, forceExit: boolean): Promise<void>;
71
+ declare function runPrerenderFromAutoRun(viteConfig: InlineConfig | undefined): Promise<{
72
+ prerenderContextPublic: PrerenderContextPublic;
73
+ }>;
34
74
  declare function runPrerender_forceExit(): void;
@@ -2,11 +2,10 @@ export { runPrerenderFromAPI };
2
2
  export { runPrerenderFromCLIPrerenderCommand };
3
3
  export { runPrerenderFromAutoRun };
4
4
  export { runPrerender_forceExit };
5
- import '../runtime/page-files/setup.js';
6
5
  import path from 'path';
7
6
  import { route } from '../../shared/route/index.js';
8
- import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, pLimit, isArray, changeEnumerable, onSetupPrerender } from './utils.js';
9
- import { prerenderPage, prerender404Page, getRenderContext, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
7
+ import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, pLimit, isArray, changeEnumerable, onSetupPrerender, isObject, makePublicCopy } from './utils.js';
8
+ import { prerenderPage, prerender404Page, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
10
9
  import pc from '@brillout/picocolors';
11
10
  import { cpus } from 'os';
12
11
  import { getGlobalContext, initGlobalContext_runPrerender, setGlobalContext_isPrerendering } from '../runtime/globalContext.js';
@@ -15,7 +14,7 @@ import { getPageFilesServerSide } from '../../shared/getPageFiles.js';
15
14
  import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
16
15
  import { getUrlFromRouteString } from '../../shared/route/resolveRouteString.js';
17
16
  import { getConfigValueFilePathToShowToUser } from '../../shared/page-configs/helpers.js';
18
- import { getConfigValueRuntime } from '../../shared/page-configs/getConfigValue.js';
17
+ import { getConfigValueRuntime } from '../../shared/page-configs/getConfigValueRuntime.js';
19
18
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
20
19
  import { isErrorPage } from '../../shared/error-page.js';
21
20
  import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.js';
@@ -28,6 +27,7 @@ import { logErrorHint } from '../runtime/renderPage/logErrorHint.js';
28
27
  import { executeHook, isUserHookError } from '../../shared/hooks/executeHook.js';
29
28
  import { getConfigValueBuildTime } from '../../shared/page-configs/getConfigValueBuildTime.js';
30
29
  import { prepareViteApiCall } from '../api/prepareViteApiCall.js';
30
+ import { setContextIsPrerendering } from './context.js';
31
31
  async function runPrerenderFromAPI(options = {}) {
32
32
  return await runPrerender(options, 'prerender()');
33
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.
@@ -46,19 +46,21 @@ async function runPrerenderFromCLIPrerenderCommand() {
46
46
  }
47
47
  runPrerender_forceExit();
48
48
  }
49
- async function runPrerenderFromAutoRun(viteConfig, forceExit) {
49
+ async function runPrerenderFromAutoRun(viteConfig) {
50
+ let prerenderContextPublic;
50
51
  try {
51
- await runPrerender({ viteConfig });
52
+ const ret = await runPrerender({ viteConfig });
53
+ prerenderContextPublic = ret.prerenderContextPublic;
52
54
  }
53
55
  catch (err) {
54
56
  console.error(err);
55
57
  logErrorHint(err);
56
58
  process.exit(1);
57
59
  }
58
- if (forceExit)
59
- runPrerender_forceExit();
60
+ return { prerenderContextPublic };
60
61
  }
61
62
  async function runPrerender(options = {}, standaloneTrigger) {
63
+ setContextIsPrerendering();
62
64
  checkOutdatedOptions(options);
63
65
  onSetupPrerender();
64
66
  setGlobalContext_isPrerendering();
@@ -69,11 +71,11 @@ async function runPrerender(options = {}, standaloneTrigger) {
69
71
  }
70
72
  await disableReactStreaming();
71
73
  const viteConfig = await resolveConfig(options.viteConfig || {}, 'build', 'production');
72
- assertLoadedConfig(viteConfig, options);
73
74
  const vikeConfig = await getVikeConfig(viteConfig);
74
75
  const { outDirClient } = getOutDirs(viteConfig);
75
76
  const { root } = viteConfig;
76
77
  const prerenderConfig = vikeConfig.vikeConfigGlobal.prerender;
78
+ validatePrerenderConfig(prerenderConfig);
77
79
  if (!prerenderConfig) {
78
80
  assert(standaloneTrigger);
79
81
  assertWarning(prerenderConfig, `You're executing ${pc.cyan(standaloneTrigger)} but the config ${pc.cyan('prerender')} isn't set to true`, {
@@ -83,39 +85,40 @@ async function runPrerender(options = {}, standaloneTrigger) {
83
85
  const { partial = false, noExtraDir = false, parallel = true } = prerenderConfig || {};
84
86
  const concurrencyLimit = pLimit(parallel === false || parallel === 0 ? 1 : parallel === true || parallel === undefined ? cpus().length : parallel);
85
87
  await initGlobalContext_runPrerender();
86
- const renderContext = await getRenderContext();
87
- renderContext.pageFilesAll.forEach(assertExportNames);
88
- const prerenderContext = {};
89
- objectAssign(prerenderContext, {
90
- _urlHandler: null,
91
- _noExtraDir: noExtraDir ?? false,
88
+ const globalContext = getGlobalContext();
89
+ globalContext.pageFilesAll.forEach(assertExportNames);
90
+ const prerenderContext = {
91
+ noExtraDir: noExtraDir ?? false,
92
92
  pageContexts: [],
93
- pageContextInit: options.pageContextInit ?? null
94
- });
93
+ pageContextInit: options.pageContextInit ?? null,
94
+ prerenderedPageContexts: {},
95
+ output: []
96
+ };
95
97
  const doNotPrerenderList = [];
96
- await collectDoNoPrerenderList(renderContext, vikeConfig.pageConfigs, doNotPrerenderList, concurrencyLimit);
97
- await callOnBeforePrerenderStartHooks(prerenderContext, renderContext, concurrencyLimit, doNotPrerenderList);
98
- await handlePagesWithStaticRoutes(prerenderContext, renderContext, doNotPrerenderList, concurrencyLimit);
99
- await callOnPrerenderStartHook(prerenderContext, renderContext);
100
- const prerenderedPageContexts = {};
98
+ await collectDoNoPrerenderList(vikeConfig.pageConfigs, doNotPrerenderList, concurrencyLimit);
99
+ await callOnBeforePrerenderStartHooks(prerenderContext, concurrencyLimit, doNotPrerenderList);
100
+ await handlePagesWithStaticRoutes(prerenderContext, doNotPrerenderList, concurrencyLimit);
101
+ await callOnPrerenderStartHook(prerenderContext);
101
102
  let prerenderedCount = 0;
103
+ // Write files as soon as pages finish rendering (instead of writing all files at once only after all pages have rendered).
102
104
  const onComplete = async (htmlFile) => {
103
105
  prerenderedCount++;
104
106
  if (htmlFile.pageId) {
105
- prerenderedPageContexts[htmlFile.pageId] = htmlFile.pageContext;
107
+ prerenderContext.prerenderedPageContexts[htmlFile.pageId] = htmlFile.pageContext;
106
108
  }
107
- await writeFiles(htmlFile, root, outDirClient, options.onPagePrerender, logLevel);
109
+ await writeFiles(htmlFile, root, outDirClient, options.onPagePrerender, prerenderContext.output, logLevel);
108
110
  };
109
111
  await routeAndPrerender(prerenderContext, concurrencyLimit, onComplete);
110
- warnContradictoryNoPrerenderList(prerenderedPageContexts, doNotPrerenderList);
111
- await prerender404(prerenderedPageContexts, renderContext, prerenderContext, onComplete);
112
+ warnContradictoryNoPrerenderList(prerenderContext.prerenderedPageContexts, doNotPrerenderList);
113
+ await prerender404(prerenderContext, onComplete);
112
114
  if (logLevel === 'info') {
113
115
  console.log(`${pc.green(`✓`)} ${prerenderedCount} HTML documents pre-rendered.`);
114
116
  }
115
- warnMissingPages(prerenderedPageContexts, doNotPrerenderList, renderContext, partial);
116
- return { viteConfig };
117
+ warnMissingPages(prerenderContext.prerenderedPageContexts, doNotPrerenderList, partial);
118
+ const prerenderContextPublic = makePublic(prerenderContext);
119
+ return { viteConfig, prerenderContextPublic };
117
120
  }
118
- async function collectDoNoPrerenderList(renderContext, pageConfigs, doNotPrerenderList, concurrencyLimit) {
121
+ async function collectDoNoPrerenderList(pageConfigs, doNotPrerenderList, concurrencyLimit) {
119
122
  // V1 design
120
123
  pageConfigs.forEach((pageConfig) => {
121
124
  const configName = 'prerender';
@@ -133,7 +136,8 @@ async function collectDoNoPrerenderList(renderContext, pageConfigs, doNotPrerend
133
136
  });
134
137
  // Old design
135
138
  // TODO/v1-release: remove
136
- await Promise.all(renderContext.pageFilesAll
139
+ const globalContext = getGlobalContext();
140
+ await Promise.all(globalContext.pageFilesAll
137
141
  .filter((p) => {
138
142
  assertExportNames(p);
139
143
  if (!p.exportNames?.includes('doNotPrerender'))
@@ -145,8 +149,8 @@ async function collectDoNoPrerenderList(renderContext, pageConfigs, doNotPrerend
145
149
  assert(p.loadFile);
146
150
  await p.loadFile();
147
151
  })));
148
- renderContext.allPageIds.forEach((pageId) => {
149
- const pageFilesServerSide = getPageFilesServerSide(renderContext.pageFilesAll, pageId);
152
+ globalContext.allPageIds.forEach((pageId) => {
153
+ const pageFilesServerSide = getPageFilesServerSide(globalContext.pageFilesAll, pageId);
150
154
  for (const p of pageFilesServerSide) {
151
155
  if (!p.exportNames?.includes('doNotPrerender'))
152
156
  continue;
@@ -175,10 +179,11 @@ function assertExportNames(pageFile) {
175
179
  const { exportNames, fileType } = pageFile;
176
180
  assert(exportNames || fileType === '.page.route' || fileType === '.css', pageFile.filePath);
177
181
  }
178
- async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext, concurrencyLimit, doNotPrerenderList) {
182
+ async function callOnBeforePrerenderStartHooks(prerenderContext, concurrencyLimit, doNotPrerenderList) {
179
183
  const onBeforePrerenderStartHooks = [];
184
+ const globalContext = getGlobalContext();
180
185
  // V1 design
181
- await Promise.all(renderContext.pageConfigs.map((pageConfig) => concurrencyLimit(async () => {
186
+ await Promise.all(globalContext.pageConfigs.map((pageConfig) => concurrencyLimit(async () => {
182
187
  const hookName = 'onBeforePrerenderStart';
183
188
  const pageConfigLoaded = await loadConfigValues(pageConfig, false);
184
189
  const hook = getHookFromPageConfig(pageConfigLoaded, hookName);
@@ -194,7 +199,7 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
194
199
  });
195
200
  })));
196
201
  // 0.4 design
197
- await Promise.all(renderContext.pageFilesAll
202
+ await Promise.all(globalContext.pageFilesAll
198
203
  .filter((p) => {
199
204
  assertExportNames(p);
200
205
  if (!p.exportNames?.includes('prerender'))
@@ -235,7 +240,7 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
235
240
  assertUsage(false, `URL ${pc.cyan(url)} provided ${providedTwice}. Make sure to provide the URL only once instead.`);
236
241
  }
237
242
  }
238
- const pageContextNew = createPageContext(url, renderContext, prerenderContext);
243
+ const pageContextNew = createPageContext(url, prerenderContext);
239
244
  objectAssign(pageContextNew, {
240
245
  _providedByHook: {
241
246
  hookFilePath,
@@ -252,9 +257,10 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
252
257
  });
253
258
  })));
254
259
  }
255
- async function handlePagesWithStaticRoutes(prerenderContext, renderContext, doNotPrerenderList, concurrencyLimit) {
260
+ async function handlePagesWithStaticRoutes(prerenderContext, doNotPrerenderList, concurrencyLimit) {
256
261
  // Pre-render pages with a static route
257
- await Promise.all(renderContext.pageRoutes.map((pageRoute) => concurrencyLimit(async () => {
262
+ const globalContext = getGlobalContext();
263
+ await Promise.all(globalContext.pageRoutes.map((pageRoute) => concurrencyLimit(async () => {
258
264
  const { pageId } = pageRoute;
259
265
  if (doNotPrerenderList.find((p) => p.pageId === pageId)) {
260
266
  return;
@@ -279,7 +285,7 @@ async function handlePagesWithStaticRoutes(prerenderContext, renderContext, doNo
279
285
  return;
280
286
  }
281
287
  const routeParams = {};
282
- const pageContext = createPageContext(urlOriginal, renderContext, prerenderContext);
288
+ const pageContext = createPageContext(urlOriginal, prerenderContext);
283
289
  objectAssign(pageContext, {
284
290
  _providedByHook: null,
285
291
  routeParams,
@@ -297,11 +303,11 @@ async function handlePagesWithStaticRoutes(prerenderContext, renderContext, doNo
297
303
  prerenderContext.pageContexts.push(pageContext);
298
304
  })));
299
305
  }
300
- function createPageContext(urlOriginal, renderContext, prerenderContext) {
306
+ function createPageContext(urlOriginal, prerenderContext) {
301
307
  const pageContext = {
302
308
  _urlHandler: null,
303
309
  _urlRewrite: null,
304
- _noExtraDir: prerenderContext._noExtraDir,
310
+ _noExtraDir: prerenderContext.noExtraDir,
305
311
  _prerenderContext: prerenderContext
306
312
  };
307
313
  const pageContextInit = {
@@ -309,17 +315,18 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
309
315
  };
310
316
  objectAssign(pageContextInit, prerenderContext.pageContextInit);
311
317
  {
312
- const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext);
318
+ const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit);
313
319
  objectAssign(pageContext, pageContextInitEnhanced);
314
320
  }
315
321
  return pageContext;
316
322
  }
317
- async function callOnPrerenderStartHook(prerenderContext, renderContext) {
323
+ async function callOnPrerenderStartHook(prerenderContext) {
324
+ const globalContext = getGlobalContext();
318
325
  let onPrerenderStartHook;
319
326
  // V1 design
320
- if (renderContext.pageConfigs.length > 0) {
327
+ if (globalContext.pageConfigs.length > 0) {
321
328
  const hookName = 'onPrerenderStart';
322
- const hook = getHookFromPageConfigGlobal(renderContext.pageConfigGlobal, hookName);
329
+ const hook = getHookFromPageConfigGlobal(globalContext.pageConfigGlobal, hookName);
323
330
  if (hook) {
324
331
  assert(hook.hookName === 'onPrerenderStart');
325
332
  onPrerenderStartHook = {
@@ -331,9 +338,9 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
331
338
  }
332
339
  // Old design
333
340
  // TODO/v1-release: remove
334
- if (renderContext.pageConfigs.length === 0) {
341
+ if (globalContext.pageConfigs.length === 0) {
335
342
  const hookTimeout = getHookTimeoutDefault('onBeforePrerender');
336
- const pageFilesWithOnBeforePrerenderHook = renderContext.pageFilesAll.filter((p) => {
343
+ const pageFilesWithOnBeforePrerenderHook = globalContext.pageFilesAll.filter((p) => {
337
344
  assertExportNames(p);
338
345
  if (!p.exportNames?.includes('onBeforePrerender'))
339
346
  return false;
@@ -386,17 +393,20 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
386
393
  const docLink = 'https://vike.dev/i18n#pre-rendering';
387
394
  // Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
388
395
  const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
389
- let result = await executeHook(() => hookFn({
390
- pageContexts: prerenderContext.pageContexts,
396
+ let result = await executeHook(() => {
397
+ const prerenderContextPublic = makePublic(prerenderContext);
391
398
  // TODO/v1-release: remove warning
392
- get prerenderPageContexts() {
393
- assertWarning(false, `prerenderPageContexts has been renamed pageContexts, see ${docLink}`, {
394
- showStackTrace: true,
395
- onlyOnce: true
396
- });
397
- return prerenderContext.pageContexts;
398
- }
399
- }), onPrerenderStartHook, null);
399
+ Object.defineProperty(prerenderContextPublic, 'prerenderPageContexts', {
400
+ get() {
401
+ assertWarning(false, `prerenderPageContexts has been renamed pageContexts, see ${docLink}`, {
402
+ showStackTrace: true,
403
+ onlyOnce: true
404
+ });
405
+ return prerenderContext.pageContexts;
406
+ }
407
+ });
408
+ return hookFn(prerenderContextPublic);
409
+ }, onPrerenderStartHook, null);
400
410
  restoreEnumerable();
401
411
  if (result === null || result === undefined) {
402
412
  return;
@@ -481,7 +491,7 @@ async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete)
481
491
  usesClientRouter = getConfigValueRuntime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
482
492
  }
483
493
  else {
484
- usesClientRouter = globalContext.pluginManifest.usesClientRouter;
494
+ usesClientRouter = globalContext.usesClientRouter;
485
495
  }
486
496
  }
487
497
  objectAssign(pageContext, {
@@ -503,7 +513,7 @@ async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete)
503
513
  pageContext,
504
514
  htmlString: documentHtml,
505
515
  pageContextSerialized,
506
- doNotCreateExtraDirectory: prerenderContext._noExtraDir,
516
+ doNotCreateExtraDirectory: prerenderContext.noExtraDir,
507
517
  pageId
508
518
  });
509
519
  })));
@@ -521,27 +531,28 @@ function warnContradictoryNoPrerenderList(prerenderedPageContexts, doNotPrerende
521
531
  assertWarning(false, `The ${providedByHook.hookName}() hook defined by ${providedByHook.hookFilePath} returns the URL ${pc.cyan(urlOriginal)}, while ${setByConfigFile} sets the config ${pc.cyan(setByConfigName)} to ${pc.cyan(String(setByConfigValue))}. This is contradictory: either don't set the config ${pc.cyan(setByConfigName)} to ${pc.cyan(String(setByConfigValue))} or remove the URL ${pc.cyan(urlOriginal)} from the list of URLs to be pre-rendered.`, { onlyOnce: true });
522
532
  });
523
533
  }
524
- function warnMissingPages(prerenderedPageContexts, doNotPrerenderList, renderContext, partial) {
525
- const isV1 = renderContext.pageConfigs.length > 0;
534
+ function warnMissingPages(prerenderedPageContexts, doNotPrerenderList, partial) {
535
+ const globalContext = getGlobalContext();
536
+ const isV1 = globalContext.pageConfigs.length > 0;
526
537
  const hookName = isV1 ? 'onBeforePrerenderStart' : 'prerender';
527
538
  /* TODO/after-v1-design-release: document setting `prerender: false` as an alternative to using prerender.partial (both in the warnings and the docs)
528
539
  const optOutName = isV1 ? 'prerender' : 'doNotPrerender'
529
540
  const msgAddendum = `Explicitly opt-out by setting the config ${optOutName} to ${isV1 ? 'false' : 'true'} or use the option prerender.partial`
530
541
  */
531
- renderContext.allPageIds
542
+ globalContext.allPageIds
532
543
  .filter((pageId) => !prerenderedPageContexts[pageId])
533
544
  .filter((pageId) => !doNotPrerenderList.find((p) => p.pageId === pageId))
534
- .filter((pageId) => !isErrorPage(pageId, renderContext.pageConfigs))
545
+ .filter((pageId) => !isErrorPage(pageId, globalContext.pageConfigs))
535
546
  .forEach((pageId) => {
536
547
  const pageAt = isV1 ? pageId : `\`${pageId}.page.*\``;
537
548
  assertWarning(partial, `Cannot pre-render page ${pageAt} because it has a non-static route, while no ${hookName}() hook returned any URL matching the page's route. You need to use a ${hookName}() hook (https://vike.dev/${hookName}) providing a list of URLs for ${pageAt} that should be pre-rendered. If you don't want to pre-render ${pageAt} then use the option prerender.partial (https://vike.dev/prerender#partial) to suppress this warning.`, { onlyOnce: true });
538
549
  });
539
550
  }
540
- async function prerender404(prerenderedPageContexts, renderContext, prerenderContext, onComplete) {
541
- if (!Object.values(prerenderedPageContexts).find(({ urlOriginal }) => urlOriginal === '/404')) {
551
+ async function prerender404(prerenderContext, onComplete) {
552
+ if (!Object.values(prerenderContext.prerenderedPageContexts).find(({ urlOriginal }) => urlOriginal === '/404')) {
542
553
  let result;
543
554
  try {
544
- result = await prerender404Page(renderContext, prerenderContext.pageContextInit);
555
+ result = await prerender404Page(prerenderContext.pageContextInit);
545
556
  }
546
557
  catch (err) {
547
558
  assertIsNotAbort(err, 'the 404 page');
@@ -561,22 +572,23 @@ async function prerender404(prerenderedPageContexts, renderContext, prerenderCon
561
572
  }
562
573
  }
563
574
  }
564
- async function writeFiles({ urlOriginal, pageContext, htmlString, pageContextSerialized, doNotCreateExtraDirectory }, root, outDirClient, onPagePrerender, logLevel) {
575
+ async function writeFiles({ urlOriginal, pageContext, htmlString, pageContextSerialized, doNotCreateExtraDirectory }, root, outDirClient, onPagePrerender, output, logLevel) {
565
576
  assert(urlOriginal.startsWith('/'));
566
577
  const writeJobs = [
567
- write(urlOriginal, pageContext, '.html', htmlString, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, logLevel)
578
+ write(urlOriginal, pageContext, 'HTML', htmlString, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, output, logLevel)
568
579
  ];
569
580
  if (pageContextSerialized !== null) {
570
- writeJobs.push(write(urlOriginal, pageContext, '.pageContext.json', pageContextSerialized, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, logLevel));
581
+ writeJobs.push(write(urlOriginal, pageContext, 'JSON', pageContextSerialized, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, output, logLevel));
571
582
  }
572
583
  await Promise.all(writeJobs);
573
584
  }
574
- async function write(urlOriginal, pageContext, fileExtension, fileContent, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, logLevel) {
585
+ async function write(urlOriginal, pageContext, fileType, fileContent, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, output, logLevel) {
575
586
  let fileUrl;
576
- if (fileExtension === '.html') {
587
+ if (fileType === 'HTML') {
577
588
  fileUrl = urlToFile(urlOriginal, '.html', doNotCreateExtraDirectory);
578
589
  }
579
590
  else {
591
+ assert(fileType === 'JSON');
580
592
  fileUrl = getPageContextRequestUrl(urlOriginal);
581
593
  }
582
594
  assertPosixPath(fileUrl);
@@ -588,6 +600,12 @@ async function write(urlOriginal, pageContext, fileExtension, fileContent, root,
588
600
  assertPosixPath(outDirClient);
589
601
  assertPosixPath(filePathRelative);
590
602
  const filePath = path.posix.join(outDirClient, filePathRelative);
603
+ output.push({
604
+ filePath,
605
+ fileType,
606
+ fileContent,
607
+ pageContext
608
+ });
591
609
  if (onPagePrerender) {
592
610
  const prerenderPageContext = {};
593
611
  objectAssign(prerenderPageContext, pageContext);
@@ -672,25 +690,6 @@ async function disableReactStreaming() {
672
690
  const { disable } = mod;
673
691
  disable();
674
692
  }
675
- function assertLoadedConfig(viteConfig, options) {
676
- if (viteConfig.plugins.some((p) => p.name.startsWith('vike'))) {
677
- return;
678
- }
679
- const { configFile } = viteConfig;
680
- if (configFile) {
681
- assertUsage(false, `${configFile} doesn't install the vike plugin`);
682
- }
683
- else {
684
- if (!options.viteConfig) {
685
- assertUsage(false, `[prerender()] No vite.config.js file found at ${process.cwd()}. Use the option ${pc.cyan('prerender({ viteConfig })')}.`, { showStackTrace: true });
686
- }
687
- else {
688
- assertUsage(false, `[prerender()] The Vite config ${pc.cyan('prerender({ viteConfig })')} is missing the vike plugin.`, {
689
- showStackTrace: true
690
- });
691
- }
692
- }
693
- }
694
693
  function isSameUrl(url1, url2) {
695
694
  return normalizeUrl(url1) === normalizeUrl(url2);
696
695
  }
@@ -740,3 +739,44 @@ function makePageContextComputedUrlNonEnumerable(pageContexts) {
740
739
  });
741
740
  }
742
741
  }
742
+ function validatePrerenderConfig(
743
+ // Guaranteed by configDef.type to be either an object or boolean
744
+ prerenderConfig) {
745
+ if (!prerenderConfig || typeof prerenderConfig === 'boolean')
746
+ return;
747
+ assert(isObject(prerenderConfig));
748
+ const wrongValue = (() => {
749
+ {
750
+ const p = 'partial';
751
+ if (!hasProp(prerenderConfig, p, 'boolean') && !hasProp(prerenderConfig, p, 'undefined'))
752
+ return { prop: p, errMsg: 'should be a boolean' };
753
+ }
754
+ {
755
+ const p = 'noExtraDir';
756
+ if (!hasProp(prerenderConfig, p, 'boolean') && !hasProp(prerenderConfig, p, 'undefined'))
757
+ return { prop: p, errMsg: 'should be a boolean' };
758
+ }
759
+ {
760
+ const p = 'disableAutoRun';
761
+ if (!hasProp(prerenderConfig, p, 'boolean') && !hasProp(prerenderConfig, p, 'undefined'))
762
+ return { prop: p, errMsg: 'should be a boolean' };
763
+ }
764
+ {
765
+ const p = 'parallel';
766
+ if (!hasProp(prerenderConfig, p, 'boolean') &&
767
+ !hasProp(prerenderConfig, p, 'number') &&
768
+ !hasProp(prerenderConfig, p, 'undefined'))
769
+ return { prop: p, errMsg: 'should be a boolean or a number' };
770
+ }
771
+ })();
772
+ if (wrongValue) {
773
+ const { prop, errMsg } = wrongValue;
774
+ assertUsage(false, `Setting ${pc.cyan(`prerender.${prop}`)} ${errMsg}`);
775
+ }
776
+ }
777
+ function makePublic(prerenderContext) {
778
+ const prerenderContextPublic = makePublicCopy(prerenderContext, 'prerenderContext', [
779
+ 'pageContexts'
780
+ ]);
781
+ return prerenderContextPublic;
782
+ }
@@ -13,4 +13,6 @@ export * from '../../utils/assertSetup.js';
13
13
  export * from '../../utils/pLimit.js';
14
14
  export * from '../../utils/isFilePathAbsoluteFilesystem.js';
15
15
  export * from '../../utils/isArray.js';
16
+ export * from '../../utils/isObject.js';
16
17
  export * from '../../utils/changeEnumerable.js';
18
+ export * from '../../utils/makePublicCopy.js';
@@ -15,4 +15,6 @@ export * from '../../utils/assertSetup.js';
15
15
  export * from '../../utils/pLimit.js';
16
16
  export * from '../../utils/isFilePathAbsoluteFilesystem.js';
17
17
  export * from '../../utils/isArray.js';
18
+ export * from '../../utils/isObject.js';
18
19
  export * from '../../utils/changeEnumerable.js';
20
+ export * from '../../utils/makePublicCopy.js';