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.
- package/dist/cjs/__internal/index.js +11 -11
- package/dist/cjs/node/api/build.js +22 -48
- package/dist/cjs/node/api/context.js +8 -6
- package/dist/cjs/node/api/index.js +17 -7
- package/dist/cjs/node/api/prepareViteApiCall.js +40 -13
- package/dist/cjs/node/cli/context.js +16 -0
- package/dist/cjs/node/cli/entry.js +21 -7
- package/dist/cjs/node/cli/utils.js +1 -0
- package/dist/cjs/node/plugin/index.js +5 -5
- package/dist/cjs/node/plugin/plugins/autoFullBuild.js +32 -20
- package/dist/cjs/node/plugin/plugins/baseUrls.js +3 -10
- package/dist/cjs/node/plugin/plugins/buildConfig.js +2 -2
- package/dist/cjs/node/plugin/plugins/{importBuild → buildEntry}/index.js +16 -17
- package/dist/cjs/node/plugin/plugins/commonConfig.js +41 -4
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +26 -23
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +171 -68
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +1 -1
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +7 -5
- package/dist/cjs/node/plugin/plugins/setGlobalContext.js +1 -1
- package/dist/cjs/node/plugin/plugins/{vite6HmrRegressionWorkaround.js → workaroundVite6HmrRegression.js} +3 -3
- package/dist/cjs/node/plugin/shared/getHttpRequestAsyncStore.js +17 -7
- package/dist/cjs/node/prerender/context.js +24 -0
- package/dist/cjs/node/prerender/runPrerender.js +146 -96
- package/dist/cjs/node/prerender/utils.js +2 -0
- package/dist/cjs/node/runtime/globalContext.js +109 -55
- package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +2 -2
- package/dist/cjs/node/runtime/index-common.js +0 -15
- package/dist/cjs/node/runtime/onLoad.js +17 -3
- package/dist/cjs/node/runtime/page-files/setup.js +2 -4
- package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -2
- package/dist/cjs/node/runtime/renderPage/createHttpResponse/getCacheControl.js +2 -2
- package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +1 -1
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -33
- package/dist/cjs/node/runtime/renderPage/resolveRedirects.js +9 -1
- package/dist/cjs/node/runtime/renderPage.js +21 -22
- package/dist/cjs/node/runtime/utils.js +2 -0
- package/dist/cjs/node/runtime-dev/index.js +17 -7
- package/dist/cjs/node/shared/assertRuntimeManifest.js +0 -2
- package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +3 -3
- package/dist/cjs/shared/getPageFiles/{setPageFiles.js → getPageFiles.js} +8 -6
- package/dist/cjs/shared/getPageFiles.js +3 -9
- package/dist/cjs/shared/hooks/getHook.js +3 -3
- package/dist/cjs/shared/{getPageFiles/getExports.js → page-configs/getPageConfigUserFriendly.js} +113 -81
- package/dist/cjs/shared/page-configs/loadConfigValues.js +5 -1
- package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +80 -55
- package/dist/cjs/shared/route/loadPageRoutes.js +3 -3
- package/dist/cjs/shared/utils.js +1 -0
- package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
- package/dist/cjs/utils/assert.js +4 -3
- package/dist/cjs/utils/assertSetup.js +47 -16
- package/dist/cjs/utils/catchInfiniteLoop.js +34 -0
- package/dist/cjs/utils/debug.js +11 -6
- package/dist/cjs/utils/getGlobalObject.js +1 -2
- package/dist/cjs/utils/isDev.js +2 -0
- package/dist/cjs/utils/makePublicCopy.js +32 -0
- package/dist/cjs/utils/objectReplace.js +9 -0
- package/dist/esm/__internal/index.d.ts +3 -5
- package/dist/esm/__internal/index.js +6 -8
- package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -1
- package/dist/esm/client/client-routing-runtime/entry.d.ts +1 -1
- package/dist/esm/client/client-routing-runtime/entry.js +0 -1
- package/dist/esm/client/client-routing-runtime/getPageContextCurrent.d.ts +2 -2
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +4 -4
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +1 -1
- package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
- package/dist/esm/client/client-routing-runtime/history.js +23 -18
- package/dist/esm/client/client-routing-runtime/index.d.ts +0 -1
- package/dist/esm/client/client-routing-runtime/index.js +0 -1
- package/dist/esm/client/client-routing-runtime/initClientRouter.js +2 -2
- package/dist/esm/client/client-routing-runtime/initOnLinkClick.js +3 -4
- package/dist/esm/client/client-routing-runtime/initOnPopState.d.ts +0 -10
- package/dist/esm/client/client-routing-runtime/initOnPopState.js +50 -62
- package/dist/esm/client/client-routing-runtime/prefetch/getPrefetchSettings.d.ts +2 -2
- package/dist/esm/client/client-routing-runtime/prefetch.d.ts +2 -2
- package/dist/esm/client/client-routing-runtime/prefetch.js +2 -2
- package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +15 -15
- package/dist/esm/client/client-routing-runtime/scrollRestoration.d.ts +4 -6
- package/dist/esm/client/client-routing-runtime/scrollRestoration.js +17 -12
- package/dist/esm/client/client-routing-runtime/setScrollPosition.d.ts +1 -1
- package/dist/esm/client/client-routing-runtime/setScrollPosition.js +29 -5
- package/dist/esm/client/client-routing-runtime/utils.d.ts +1 -0
- package/dist/esm/client/client-routing-runtime/utils.js +1 -0
- package/dist/esm/client/server-routing-runtime/entry.d.ts +1 -1
- package/dist/esm/client/server-routing-runtime/entry.js +0 -1
- package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +1 -1
- package/dist/esm/client/server-routing-runtime/getPageContext.js +5 -2
- package/dist/esm/client/shared/executeOnRenderClientHook.d.ts +2 -2
- package/dist/esm/client/shared/loadUserFilesClientSide.d.ts +2 -2
- package/dist/esm/client/shared/loadUserFilesClientSide.js +2 -2
- package/dist/esm/client/shared/normalizeClientSideUrl.js +2 -3
- package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +2 -2
- package/dist/esm/node/api/build.d.ts +1 -6
- package/dist/esm/node/api/build.js +20 -26
- package/dist/esm/node/api/context.d.ts +4 -2
- package/dist/esm/node/api/context.js +8 -7
- package/dist/esm/node/api/prepareViteApiCall.d.ts +0 -1
- package/dist/esm/node/api/prepareViteApiCall.js +26 -9
- package/dist/esm/node/cli/context.d.ts +5 -0
- package/dist/esm/node/cli/context.js +14 -0
- package/dist/esm/node/cli/entry.js +4 -0
- package/dist/esm/node/cli/parseCli.d.ts +3 -1
- package/dist/esm/node/cli/utils.d.ts +1 -0
- package/dist/esm/node/cli/utils.js +1 -0
- package/dist/esm/node/plugin/index.d.ts +1 -1
- package/dist/esm/node/plugin/index.js +5 -5
- package/dist/esm/node/plugin/plugins/autoFullBuild.js +32 -20
- package/dist/esm/node/plugin/plugins/baseUrls.d.ts +1 -1
- package/dist/esm/node/plugin/plugins/baseUrls.js +4 -11
- package/dist/esm/node/plugin/plugins/buildConfig.js +2 -2
- package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/getVikeManifest.d.ts +1 -1
- package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/index.d.ts +2 -2
- package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/index.js +16 -17
- package/dist/esm/node/plugin/plugins/commonConfig.d.ts +10 -1
- package/dist/esm/node/plugin/plugins/commonConfig.js +42 -5
- package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.d.ts +1 -1
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +6 -9
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +25 -22
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +96 -1
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +167 -64
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +1 -1
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +7 -5
- package/dist/esm/node/plugin/plugins/setGlobalContext.js +1 -1
- package/dist/esm/node/plugin/plugins/workaroundVite6HmrRegression.d.ts +3 -0
- package/dist/esm/node/plugin/plugins/{vite6HmrRegressionWorkaround.js → workaroundVite6HmrRegression.js} +3 -3
- package/dist/esm/node/prerender/context.d.ts +9 -0
- package/dist/esm/node/prerender/context.js +22 -0
- package/dist/esm/node/prerender/runPrerender.d.ts +42 -2
- package/dist/esm/node/prerender/runPrerender.js +130 -90
- package/dist/esm/node/prerender/utils.d.ts +2 -0
- package/dist/esm/node/prerender/utils.js +2 -0
- package/dist/esm/node/runtime/globalContext.d.ts +23 -7
- package/dist/esm/node/runtime/globalContext.js +109 -55
- package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +1 -1
- package/dist/esm/node/runtime/index-common.d.ts +0 -1
- package/dist/esm/node/runtime/index-common.js +0 -15
- package/dist/esm/node/runtime/index-deprecated.d.ts +1 -0
- package/dist/esm/node/runtime/onLoad.js +16 -2
- package/dist/esm/node/runtime/page-files/setup.js +3 -3
- package/dist/esm/node/runtime/renderPage/analyzePage.js +1 -1
- package/dist/esm/node/runtime/renderPage/createHttpResponse/getCacheControl.js +1 -1
- package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +2 -2
- package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +31 -46
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -33
- package/dist/esm/node/runtime/renderPage/resolveRedirects.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/resolveRedirects.js +9 -1
- package/dist/esm/node/runtime/renderPage.js +22 -23
- package/dist/esm/node/runtime/utils.d.ts +2 -0
- package/dist/esm/node/runtime/utils.js +2 -0
- package/dist/esm/node/shared/assertPluginManifest.d.ts +0 -1
- package/dist/esm/node/shared/assertRuntimeManifest.d.ts +0 -1
- package/dist/esm/node/shared/assertRuntimeManifest.js +1 -3
- package/dist/esm/shared/getPageFiles/analyzeClientSide.js +1 -1
- package/dist/esm/shared/getPageFiles/{setPageFiles.d.ts → getPageFiles.d.ts} +3 -1
- package/dist/esm/shared/getPageFiles/{setPageFiles.js → getPageFiles.js} +8 -6
- package/dist/esm/shared/getPageFiles.d.ts +2 -5
- package/dist/esm/shared/getPageFiles.js +1 -4
- package/dist/esm/shared/hooks/getHook.d.ts +3 -3
- package/dist/esm/shared/hooks/getHook.js +1 -1
- package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +9 -5
- package/dist/esm/shared/page-configs/Config.d.ts +20 -2
- package/dist/esm/shared/page-configs/PageConfig.d.ts +13 -6
- package/dist/esm/shared/{getPageFiles/getExports.d.ts → page-configs/getPageConfigUserFriendly.d.ts} +26 -12
- package/dist/esm/shared/{getPageFiles/getExports.js → page-configs/getPageConfigUserFriendly.js} +112 -80
- package/dist/esm/shared/page-configs/loadConfigValues.js +6 -2
- package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +26 -6
- package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +80 -55
- package/dist/esm/shared/route/executeGuardHook.d.ts +2 -2
- package/dist/esm/shared/route/loadPageRoutes.js +1 -1
- package/dist/esm/shared/types.d.ts +1 -1
- package/dist/esm/shared/utils.d.ts +1 -0
- package/dist/esm/shared/utils.js +1 -0
- package/dist/esm/types/index.d.ts +1 -1
- package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/esm/utils/PROJECT_VERSION.js +1 -1
- package/dist/esm/utils/assert.js +4 -3
- package/dist/esm/utils/assertSetup.js +47 -16
- package/dist/esm/utils/catchInfiniteLoop.d.ts +2 -0
- package/dist/esm/utils/catchInfiniteLoop.js +32 -0
- package/dist/esm/utils/debug.d.ts +1 -1
- package/dist/esm/utils/debug.js +11 -6
- package/dist/esm/utils/getGlobalObject.js +1 -2
- package/dist/esm/utils/isDev.js +2 -0
- package/dist/esm/utils/makePublicCopy.d.ts +3 -0
- package/dist/esm/utils/makePublicCopy.js +30 -0
- package/dist/esm/utils/objectReplace.d.ts +1 -0
- package/dist/esm/utils/objectReplace.js +6 -0
- package/dist/esm/utils/projectInfo.d.ts +1 -1
- package/package.json +4 -13
- package/__internal/loadImportBuild.js +0 -3
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveVikeConfigGlobal.js +0 -128
- package/dist/cjs/node/runtime/globalContext/loadImportBuild.js +0 -25
- package/dist/cjs/node/runtime/page-files/getPageFilesExports.js +0 -22
- package/dist/esm/client/client-routing-runtime/pageFiles.d.ts +0 -1
- package/dist/esm/client/client-routing-runtime/pageFiles.js +0 -4
- package/dist/esm/client/server-routing-runtime/pageFiles.d.ts +0 -1
- package/dist/esm/client/server-routing-runtime/pageFiles.js +0 -4
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveVikeConfigGlobal.d.ts +0 -104
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveVikeConfigGlobal.js +0 -123
- package/dist/esm/node/plugin/plugins/vite6HmrRegressionWorkaround.d.ts +0 -3
- package/dist/esm/node/runtime/globalContext/loadImportBuild.d.ts +0 -18
- package/dist/esm/node/runtime/globalContext/loadImportBuild.js +0 -23
- package/dist/esm/node/runtime/page-files/getPageFilesExports.d.ts +0 -2
- package/dist/esm/node/runtime/page-files/getPageFilesExports.js +0 -20
- /package/dist/cjs/node/plugin/plugins/{importBuild → buildEntry}/getVikeManifest.js +0 -0
- /package/dist/cjs/shared/page-configs/{getConfigValue.js → getConfigValueRuntime.js} +0 -0
- /package/dist/esm/node/plugin/plugins/{importBuild → buildEntry}/getVikeManifest.js +0 -0
- /package/dist/esm/shared/page-configs/{getConfigValue.d.ts → getConfigValueRuntime.d.ts} +0 -0
- /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
|
|
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
|
-
|
|
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 }),
|
|
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 }),
|
|
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
|
|
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);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export {
|
|
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
|
|
6
|
+
function workaroundVite6HmrRegression() {
|
|
7
7
|
return {
|
|
8
|
-
name: 'vike:
|
|
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
|
-
|
|
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
|
|
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,
|
|
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/
|
|
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
|
|
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
|
-
|
|
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
|
|
87
|
-
|
|
88
|
-
const prerenderContext = {
|
|
89
|
-
|
|
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(
|
|
97
|
-
await callOnBeforePrerenderStartHooks(prerenderContext,
|
|
98
|
-
await handlePagesWithStaticRoutes(prerenderContext,
|
|
99
|
-
await callOnPrerenderStartHook(prerenderContext
|
|
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(
|
|
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,
|
|
116
|
-
|
|
117
|
+
warnMissingPages(prerenderContext.prerenderedPageContexts, doNotPrerenderList, partial);
|
|
118
|
+
const prerenderContextPublic = makePublic(prerenderContext);
|
|
119
|
+
return { viteConfig, prerenderContextPublic };
|
|
117
120
|
}
|
|
118
|
-
async function collectDoNoPrerenderList(
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
const pageFilesServerSide = getPageFilesServerSide(
|
|
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,
|
|
182
|
+
async function callOnBeforePrerenderStartHooks(prerenderContext, concurrencyLimit, doNotPrerenderList) {
|
|
179
183
|
const onBeforePrerenderStartHooks = [];
|
|
184
|
+
const globalContext = getGlobalContext();
|
|
180
185
|
// V1 design
|
|
181
|
-
await Promise.all(
|
|
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(
|
|
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,
|
|
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,
|
|
260
|
+
async function handlePagesWithStaticRoutes(prerenderContext, doNotPrerenderList, concurrencyLimit) {
|
|
256
261
|
// Pre-render pages with a static route
|
|
257
|
-
|
|
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,
|
|
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,
|
|
306
|
+
function createPageContext(urlOriginal, prerenderContext) {
|
|
301
307
|
const pageContext = {
|
|
302
308
|
_urlHandler: null,
|
|
303
309
|
_urlRewrite: null,
|
|
304
|
-
_noExtraDir: prerenderContext.
|
|
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
|
|
318
|
+
const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit);
|
|
313
319
|
objectAssign(pageContext, pageContextInitEnhanced);
|
|
314
320
|
}
|
|
315
321
|
return pageContext;
|
|
316
322
|
}
|
|
317
|
-
async function callOnPrerenderStartHook(prerenderContext
|
|
323
|
+
async function callOnPrerenderStartHook(prerenderContext) {
|
|
324
|
+
const globalContext = getGlobalContext();
|
|
318
325
|
let onPrerenderStartHook;
|
|
319
326
|
// V1 design
|
|
320
|
-
if (
|
|
327
|
+
if (globalContext.pageConfigs.length > 0) {
|
|
321
328
|
const hookName = 'onPrerenderStart';
|
|
322
|
-
const hook = getHookFromPageConfigGlobal(
|
|
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 (
|
|
341
|
+
if (globalContext.pageConfigs.length === 0) {
|
|
335
342
|
const hookTimeout = getHookTimeoutDefault('onBeforePrerender');
|
|
336
|
-
const pageFilesWithOnBeforePrerenderHook =
|
|
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(() =>
|
|
390
|
-
|
|
396
|
+
let result = await executeHook(() => {
|
|
397
|
+
const prerenderContextPublic = makePublic(prerenderContext);
|
|
391
398
|
// TODO/v1-release: remove warning
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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.
|
|
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.
|
|
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,
|
|
525
|
-
const
|
|
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
|
-
|
|
542
|
+
globalContext.allPageIds
|
|
532
543
|
.filter((pageId) => !prerenderedPageContexts[pageId])
|
|
533
544
|
.filter((pageId) => !doNotPrerenderList.find((p) => p.pageId === pageId))
|
|
534
|
-
.filter((pageId) => !isErrorPage(pageId,
|
|
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(
|
|
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(
|
|
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, '
|
|
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, '
|
|
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,
|
|
585
|
+
async function write(urlOriginal, pageContext, fileType, fileContent, root, outDirClient, doNotCreateExtraDirectory, onPagePrerender, output, logLevel) {
|
|
575
586
|
let fileUrl;
|
|
576
|
-
if (
|
|
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';
|