vike 0.4.152-commit-6f928f9 → 0.4.153-commit-159c659
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/node/cli/bin.js +2 -2
- package/dist/cjs/node/plugin/index.js +2 -2
- package/dist/cjs/node/plugin/plugins/autoFullBuild.js +2 -2
- package/dist/cjs/node/plugin/plugins/envVars.js +1 -1
- package/dist/cjs/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +4 -4
- package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
- package/dist/cjs/node/prerender/index.js +1 -1
- package/dist/cjs/node/prerender/runPrerender.js +21 -13
- package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +5 -3
- package/dist/cjs/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +5 -5
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
- package/dist/cjs/node/runtime/renderPage.js +2 -2
- package/dist/cjs/shared/hooks/getHook.js +14 -8
- package/dist/cjs/shared/misc/isRenderFailure.js +4 -0
- package/dist/cjs/shared/misc/pageContextInitIsPassedToClient.js +4 -0
- package/dist/cjs/shared/route/abort.js +15 -4
- package/dist/cjs/shared/route/loadPageRoutes.js +1 -9
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +27 -32
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +39 -55
- package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +1 -1
- package/dist/esm/client/client-routing-runtime/installClientRouter.js +8 -2
- package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +2 -2
- package/dist/esm/client/client-routing-runtime/onLinkClick.js +2 -2
- package/dist/esm/client/client-routing-runtime/prefetch.js +2 -2
- package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +209 -141
- package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +2 -2
- package/dist/esm/client/server-routing-runtime/getPageContext.js +5 -4
- package/dist/esm/client/shared/getPageContextSerializedInHtml.d.ts +0 -1
- package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -4
- package/dist/esm/client/shared/{loadPageFilesClientSide.d.ts → loadUserFilesClientSide.d.ts} +7 -6
- package/dist/esm/client/shared/{loadPageFilesClientSide.js → loadUserFilesClientSide.js} +4 -4
- package/dist/esm/node/cli/bin.js +3 -3
- package/dist/esm/node/plugin/index.js +2 -2
- package/dist/esm/node/plugin/plugins/autoFullBuild.js +3 -3
- package/dist/esm/node/plugin/plugins/envVars.js +1 -1
- package/dist/esm/node/plugin/plugins/fileEnv.d.ts +3 -0
- package/dist/esm/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +3 -3
- package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
- package/dist/esm/node/prerender/index.d.ts +1 -1
- package/dist/esm/node/prerender/index.js +1 -1
- package/dist/esm/node/prerender/runPrerender.d.ts +8 -8
- package/dist/esm/node/prerender/runPrerender.js +22 -14
- package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +0 -1
- package/dist/esm/node/runtime/html/serializePageContextClientSide.js +5 -3
- package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.d.ts → loadUserFilesServerSide.d.ts} +6 -6
- package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +4 -4
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
- package/dist/esm/node/runtime/renderPage.js +2 -2
- package/dist/esm/shared/hooks/getHook.d.ts +2 -0
- package/dist/esm/shared/hooks/getHook.js +13 -7
- package/dist/esm/shared/misc/isRenderFailure.d.ts +1 -0
- package/dist/esm/shared/misc/isRenderFailure.js +1 -0
- package/dist/esm/shared/misc/pageContextInitIsPassedToClient.d.ts +1 -0
- package/dist/esm/shared/misc/pageContextInitIsPassedToClient.js +1 -0
- package/dist/esm/shared/route/abort.d.ts +1 -1
- package/dist/esm/shared/route/abort.js +16 -5
- package/dist/esm/shared/route/loadPageRoutes.js +1 -9
- package/dist/esm/utils/projectInfo.d.ts +2 -2
- package/dist/esm/utils/projectInfo.js +1 -1
- package/package.json +1 -1
- package/dist/esm/node/plugin/plugins/assertFileEnv.d.ts +0 -3
|
@@ -23,7 +23,7 @@ import { extensionsAssets } from './plugins/extensionsAssets.js';
|
|
|
23
23
|
import { baseUrls } from './plugins/baseUrls.js';
|
|
24
24
|
import { envVarsPlugin } from './plugins/envVars.js';
|
|
25
25
|
import pc from '@brillout/picocolors';
|
|
26
|
-
import {
|
|
26
|
+
import { fileEnv } from './plugins/fileEnv.js';
|
|
27
27
|
markEnvAsVite();
|
|
28
28
|
// Return as `any` to avoid Plugin type mismatches when there are multiple Vite versions installed
|
|
29
29
|
function plugin(vikeConfig) {
|
|
@@ -46,7 +46,7 @@ function plugin(vikeConfig) {
|
|
|
46
46
|
extensionsAssets(),
|
|
47
47
|
baseUrls(vikeConfig),
|
|
48
48
|
envVarsPlugin(),
|
|
49
|
-
|
|
49
|
+
fileEnv()
|
|
50
50
|
];
|
|
51
51
|
return plugins;
|
|
52
52
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { autoFullBuild };
|
|
2
2
|
import { build } from 'vite';
|
|
3
3
|
import { assertWarning } from '../utils.js';
|
|
4
|
-
import {
|
|
4
|
+
import { runPrerenderFromAutoFullBuild, runPrerender_forceExit } from '../../prerender/runPrerender.js';
|
|
5
5
|
import { getConfigVike } from '../../shared/getConfigVike.js';
|
|
6
6
|
import { isViteCliCall, getViteConfigFromCli } from '../shared/isViteCliCall.js';
|
|
7
7
|
import pc from '@brillout/picocolors';
|
|
@@ -45,7 +45,7 @@ function autoFullBuild() {
|
|
|
45
45
|
order: 'post',
|
|
46
46
|
handler() {
|
|
47
47
|
if (forceExit) {
|
|
48
|
-
|
|
48
|
+
runPrerender_forceExit();
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -78,7 +78,7 @@ async function triggerFullBuild(config, configVike, bundle) {
|
|
|
78
78
|
}
|
|
79
79
|
});
|
|
80
80
|
if (configVike.prerender && !configVike.prerender.disableAutoRun) {
|
|
81
|
-
await
|
|
81
|
+
await runPrerenderFromAutoFullBuild({ viteConfig: configInline });
|
|
82
82
|
forceExit = true;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { fileEnv };
|
|
2
2
|
import { assert, assertUsage, assertWarning, capitalizeFirstLetter, getFilePathRelativeToUserRootDir } from '../utils.js';
|
|
3
3
|
import { extractAssetsRE } from './extractAssetsPlugin.js';
|
|
4
4
|
import { extractExportNamesRE } from './extractExportNamesPlugin.js';
|
|
5
5
|
import pc from '@brillout/picocolors';
|
|
6
|
-
function
|
|
6
|
+
function fileEnv() {
|
|
7
7
|
let config;
|
|
8
8
|
let isDev = false;
|
|
9
9
|
return {
|
|
10
|
-
name: 'vike:
|
|
10
|
+
name: 'vike:fileEnv',
|
|
11
11
|
// - We need to set `enforce: 'pre'` because, otherwise, the resolvedId() hook of Vite's internal plugin `vite:resolve` is called before and it doesn't seem to call `this.resolve()` which means that the resolveId() hook below is never called.
|
|
12
12
|
// - Vite's `vite:resolve` plugin: https://github.com/vitejs/vite/blob/d649daba7682791178b711d9a3e44a6b5d00990c/packages/vite/src/node/plugins/resolve.ts#L105
|
|
13
13
|
// - It's actually a good thing if the resolveId() hook below is the first one to be called because it doesn't actually resolve any ID, so all other resolveId() hooks will be called as normal. And with `this.resolve()` we get the information we want from all other resolvedId() hooks.
|
|
@@ -829,7 +829,7 @@ function getConfigName(filePath) {
|
|
|
829
829
|
if (isTmpFile(filePath))
|
|
830
830
|
return null;
|
|
831
831
|
const fileName = path.posix.basename(filePath);
|
|
832
|
-
assertNoUnexpectedPlusSign(filePath, fileName)
|
|
832
|
+
// assertNoUnexpectedPlusSign(filePath, fileName)
|
|
833
833
|
const basename = fileName.split('.')[0];
|
|
834
834
|
if (!basename.startsWith('+')) {
|
|
835
835
|
return null;
|
|
@@ -839,14 +839,6 @@ function getConfigName(filePath) {
|
|
|
839
839
|
return configName;
|
|
840
840
|
}
|
|
841
841
|
}
|
|
842
|
-
function assertNoUnexpectedPlusSign(filePath, fileName) {
|
|
843
|
-
const dirs = path.posix.dirname(filePath).split('/');
|
|
844
|
-
dirs.forEach((dir, i) => {
|
|
845
|
-
const dirPath = dirs.slice(0, i + 1).join('/');
|
|
846
|
-
assertUsage(!dir.includes('+'), `Character '+' is a reserved character: remove '+' from the directory name ${dirPath}/`);
|
|
847
|
-
});
|
|
848
|
-
assertUsage(!fileName.slice(1).includes('+'), `Character '+' is only allowed at the beginning of filenames: make sure ${filePath} doesn't contain any '+' in its filename other than its first letter`);
|
|
849
|
-
}
|
|
850
842
|
async function loadConfigFile(configFilePath, userRootDir, visited) {
|
|
851
843
|
const { filePathAbsoluteFilesystem } = configFilePath;
|
|
852
844
|
assertNoInfiniteLoop(visited, filePathAbsoluteFilesystem);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { runPrerenderFromAPI as prerender } from './runPrerender.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { runPrerenderFromAPI as prerender } from './runPrerender.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
1
|
+
export { runPrerenderFromAPI };
|
|
2
|
+
export { runPrerenderFromCLI };
|
|
3
|
+
export { runPrerenderFromAutoFullBuild };
|
|
4
|
+
export { runPrerender_forceExit };
|
|
5
5
|
export type { PrerenderOptions };
|
|
6
6
|
import '../runtime/page-files/setup.js';
|
|
7
7
|
import type { InlineConfig } from 'vite';
|
|
@@ -47,7 +47,7 @@ type PrerenderOptions = {
|
|
|
47
47
|
/** @deprecated */
|
|
48
48
|
base?: string;
|
|
49
49
|
};
|
|
50
|
-
declare function
|
|
51
|
-
declare function
|
|
52
|
-
declare function
|
|
53
|
-
declare function
|
|
50
|
+
declare function runPrerenderFromAPI(options?: PrerenderOptions): Promise<void>;
|
|
51
|
+
declare function runPrerenderFromCLI(options: PrerenderOptions): Promise<void>;
|
|
52
|
+
declare function runPrerenderFromAutoFullBuild(options: PrerenderOptions): Promise<void>;
|
|
53
|
+
declare function runPrerender_forceExit(): void;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
1
|
+
export { runPrerenderFromAPI };
|
|
2
|
+
export { runPrerenderFromCLI };
|
|
3
|
+
export { runPrerenderFromAutoFullBuild };
|
|
4
|
+
export { runPrerender_forceExit };
|
|
5
5
|
import '../runtime/page-files/setup.js';
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import { route } from '../../shared/route/index.js';
|
|
8
|
-
import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, executeHook, isPlainObject, setNodeEnvToProduction } from './utils.js';
|
|
8
|
+
import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, executeHook, isPlainObject, setNodeEnvToProduction, isUserHookError } from './utils.js';
|
|
9
9
|
import { pLimit } from '../../utils/pLimit.js';
|
|
10
10
|
import { prerenderPage, prerender404Page, getRenderContext, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
|
|
11
11
|
import pc from '@brillout/picocolors';
|
|
@@ -22,21 +22,22 @@ import { isErrorPage } from '../../shared/error-page.js';
|
|
|
22
22
|
import { addUrlComputedProps } from '../../shared/addUrlComputedProps.js';
|
|
23
23
|
import { assertPathIsFilesystemAbsolute } from '../../utils/assertPathIsFilesystemAbsolute.js';
|
|
24
24
|
import { isAbortError } from '../../shared/route/abort.js';
|
|
25
|
-
import {
|
|
26
|
-
import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault } from '../../shared/hooks/getHook.js';
|
|
25
|
+
import { loadUserFilesServerSide } from '../runtime/renderPage/loadUserFilesServerSide.js';
|
|
26
|
+
import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, setIsPrerenderering } from '../../shared/hooks/getHook.js';
|
|
27
27
|
import { noRouteMatch } from '../../shared/route/noRouteMatch.js';
|
|
28
28
|
import { getVikeConfig } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
|
|
29
|
-
async function
|
|
29
|
+
async function runPrerenderFromAPI(options = {}) {
|
|
30
30
|
await runPrerender(options, 'prerender()');
|
|
31
31
|
}
|
|
32
|
-
async function
|
|
32
|
+
async function runPrerenderFromCLI(options) {
|
|
33
33
|
await runPrerender(options, '$ vike prerender');
|
|
34
34
|
}
|
|
35
|
-
async function
|
|
35
|
+
async function runPrerenderFromAutoFullBuild(options) {
|
|
36
36
|
await runPrerender(options, null);
|
|
37
37
|
}
|
|
38
38
|
async function runPrerender(options, manuallyTriggered) {
|
|
39
39
|
checkOutdatedOptions(options);
|
|
40
|
+
setIsPrerenderering();
|
|
40
41
|
const logLevel = !!options.onPagePrerender ? 'warn' : 'info';
|
|
41
42
|
if (logLevel === 'info') {
|
|
42
43
|
console.log(`${pc.cyan(`vike v${projectInfo.projectVersion}`)} ${pc.green('pre-rendering HTML...')}`);
|
|
@@ -269,7 +270,7 @@ async function handlePagesWithStaticRoutes(prerenderContext, renderContext, doNo
|
|
|
269
270
|
}
|
|
270
271
|
]
|
|
271
272
|
});
|
|
272
|
-
objectAssign(pageContext, await
|
|
273
|
+
objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
|
|
273
274
|
prerenderContext.pageContexts.push(pageContext);
|
|
274
275
|
})));
|
|
275
276
|
}
|
|
@@ -449,7 +450,7 @@ async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete)
|
|
|
449
450
|
assert(pageContextFromRoute._pageId);
|
|
450
451
|
objectAssign(pageContext, pageContextFromRoute);
|
|
451
452
|
const { _pageId: pageId } = pageContext;
|
|
452
|
-
objectAssign(pageContext, await
|
|
453
|
+
objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
|
|
453
454
|
let usesClientRouter;
|
|
454
455
|
{
|
|
455
456
|
if (pageContext._pageConfigs.length > 0) {
|
|
@@ -672,7 +673,7 @@ function isSameUrl(url1, url2) {
|
|
|
672
673
|
function normalizeUrl(url) {
|
|
673
674
|
return '/' + url.split('/').filter(Boolean).join('/');
|
|
674
675
|
}
|
|
675
|
-
function
|
|
676
|
+
function runPrerender_forceExit() {
|
|
676
677
|
// Force exit; known situations where pre-rendering is hanging:
|
|
677
678
|
// - https://github.com/vikejs/vike/discussions/774#discussioncomment-5584551
|
|
678
679
|
// - https://github.com/vikejs/vike/issues/807#issuecomment-1519010902
|
|
@@ -686,5 +687,12 @@ function assertIsNotAbort(err, urlOr404) {
|
|
|
686
687
|
if (!isAbortError(err))
|
|
687
688
|
return;
|
|
688
689
|
const pageContextAbort = err._pageContextAbort;
|
|
689
|
-
|
|
690
|
+
const hookLoc = isUserHookError(err);
|
|
691
|
+
assert(hookLoc);
|
|
692
|
+
const thrownBy = ` by ${pc.cyan(`${hookLoc.hookName}()`)} hook defined at ${hookLoc.hookFilePath}`;
|
|
693
|
+
const abortCaller = pageContextAbort._abortCaller;
|
|
694
|
+
assert(abortCaller);
|
|
695
|
+
const abortCall = pageContextAbort._abortCall;
|
|
696
|
+
assert(abortCall);
|
|
697
|
+
assertUsage(false, `${pc.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${pc.cyan(abortCaller)} isn't supported for pre-rendered pages`);
|
|
690
698
|
}
|
|
@@ -9,7 +9,6 @@ type PageContextSerialization = {
|
|
|
9
9
|
_pageConfigs: PageConfigRuntime[];
|
|
10
10
|
is404: null | boolean;
|
|
11
11
|
pageProps?: Record<string, unknown>;
|
|
12
|
-
_isError?: true;
|
|
13
12
|
_pageContextInit: Record<string, unknown>;
|
|
14
13
|
};
|
|
15
14
|
declare function serializePageContextClientSide(pageContext: PageContextSerialization): string;
|
|
@@ -6,6 +6,8 @@ import { isErrorPage } from '../../../shared/error-page.js';
|
|
|
6
6
|
import { addIs404ToPageProps } from '../../../shared/addIs404ToPageProps.js';
|
|
7
7
|
import pc from '@brillout/picocolors';
|
|
8
8
|
import { notSerializable } from '../../../shared/notSerializable.js';
|
|
9
|
+
import { pageContextInitIsPassedToClient } from '../../../shared/misc/pageContextInitIsPassedToClient.js';
|
|
10
|
+
import { isRenderFailure } from '../../../shared/misc/isRenderFailure.js';
|
|
9
11
|
const PASS_TO_CLIENT = [
|
|
10
12
|
'abortReason',
|
|
11
13
|
'_urlRewrite',
|
|
@@ -15,11 +17,11 @@ const PASS_TO_CLIENT = [
|
|
|
15
17
|
/* Not needed on the client-side
|
|
16
18
|
'_abortCaller',
|
|
17
19
|
*/
|
|
18
|
-
|
|
20
|
+
pageContextInitIsPassedToClient,
|
|
19
21
|
'_pageId',
|
|
20
22
|
'data' // for data() hook
|
|
21
23
|
];
|
|
22
|
-
const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404',
|
|
24
|
+
const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isRenderFailure];
|
|
23
25
|
function serializePageContextClientSide(pageContext) {
|
|
24
26
|
const passToClient = getPassToClient(pageContext);
|
|
25
27
|
const pageContextClient = {};
|
|
@@ -28,7 +30,7 @@ function serializePageContextClientSide(pageContext) {
|
|
|
28
30
|
pageContextClient[prop] = pageContext[prop];
|
|
29
31
|
});
|
|
30
32
|
if (Object.keys(pageContext._pageContextInit).some((p) => passToClient.includes(p))) {
|
|
31
|
-
pageContextClient.
|
|
33
|
+
pageContextClient._pageContextInitIsPassedToClient = true;
|
|
32
34
|
}
|
|
33
35
|
let pageContextSerialized;
|
|
34
36
|
try {
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { loadUserFilesServerSide };
|
|
2
2
|
export type { PageFiles };
|
|
3
|
-
export type {
|
|
3
|
+
export type { PageContext_loadUserFilesServerSide };
|
|
4
4
|
import { type PageFile } from '../../../shared/getPageFiles.js';
|
|
5
5
|
import { PromiseType } from '../utils.js';
|
|
6
6
|
import { PageContextGetPageAssets, type PageAsset } from './getPageAssets.js';
|
|
7
7
|
import { type PageContextDebugRouteMatches } from './debugPageFiles.js';
|
|
8
8
|
import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
|
|
9
|
-
type
|
|
9
|
+
type PageContext_loadUserFilesServerSide = PageContextGetPageAssets & PageContextDebugRouteMatches & {
|
|
10
10
|
urlOriginal: string;
|
|
11
11
|
_pageFilesAll: PageFile[];
|
|
12
12
|
_pageConfigs: PageConfigRuntime[];
|
|
13
13
|
};
|
|
14
|
-
type PageFiles = PromiseType<ReturnType<typeof
|
|
15
|
-
declare function
|
|
14
|
+
type PageFiles = PromiseType<ReturnType<typeof loadUserFilesServerSide>>;
|
|
15
|
+
declare function loadUserFilesServerSide(pageContext: {
|
|
16
16
|
_pageId: string;
|
|
17
|
-
} &
|
|
17
|
+
} & PageContext_loadUserFilesServerSide): Promise<{
|
|
18
18
|
config: Record<string, unknown>;
|
|
19
19
|
configEntries: import("../../../shared/getPageFiles/getExports.js").ConfigEntries;
|
|
20
20
|
exports: Record<string, unknown>;
|
package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { loadUserFilesServerSide };
|
|
2
2
|
import { getExportUnion, getPageFilesServerSide, getExports } from '../../../shared/getPageFiles.js';
|
|
3
3
|
import { analyzePageClientSideInit } from '../../../shared/getPageFiles/analyzePageClientSide.js';
|
|
4
4
|
import { assertWarning, objectAssign } from '../utils.js';
|
|
@@ -8,10 +8,10 @@ import { findPageConfig } from '../../../shared/page-configs/findPageConfig.js';
|
|
|
8
8
|
import { analyzePage } from './analyzePage.js';
|
|
9
9
|
import { getGlobalContext } from '../globalContext.js';
|
|
10
10
|
import { loadConfigValues } from '../../../shared/page-configs/loadConfigValues.js';
|
|
11
|
-
async function
|
|
11
|
+
async function loadUserFilesServerSide(pageContext) {
|
|
12
12
|
const pageConfig = findPageConfig(pageContext._pageConfigs, pageContext._pageId); // Make pageConfig globally available as pageContext._pageConfig?
|
|
13
13
|
const [{ config, configEntries, exports, exportsAll, pageExports, pageFilesLoaded, pageConfigLoaded }] = await Promise.all([
|
|
14
|
-
|
|
14
|
+
loadPageUserFiles(pageContext._pageFilesAll, pageConfig, pageContext._pageId, !getGlobalContext().isProduction),
|
|
15
15
|
analyzePageClientSideInit(pageContext._pageFilesAll, pageContext._pageId, { sharedPageFilesAlreadyLoaded: true })
|
|
16
16
|
]);
|
|
17
17
|
const { isHtmlOnly, isClientRouting, clientEntries, clientDependencies, pageFilesClientSide, pageFilesServerSide } = analyzePage(pageContext._pageFilesAll, pageConfig, pageContext._pageId);
|
|
@@ -80,7 +80,7 @@ async function loadPageFilesServerSide(pageContext) {
|
|
|
80
80
|
}
|
|
81
81
|
return pageContextAddendum;
|
|
82
82
|
}
|
|
83
|
-
async function
|
|
83
|
+
async function loadPageUserFiles(pageFilesAll, pageConfig, pageId, isDev) {
|
|
84
84
|
const pageFilesServerSide = getPageFilesServerSide(pageFilesAll, pageId);
|
|
85
85
|
const pageConfigLoaded = !pageConfig ? null : await loadConfigValues(pageConfig, isDev);
|
|
86
86
|
await Promise.all(pageFilesServerSide.map((p) => p.loadFile?.()));
|
|
@@ -9,7 +9,7 @@ export type { PageContextInitEnhanced };
|
|
|
9
9
|
import { type PageFile } from '../../../shared/getPageFiles.js';
|
|
10
10
|
import { type PageContextUrlComputedPropsInternal } from '../../../shared/addUrlComputedProps.js';
|
|
11
11
|
import { HttpResponse } from './createHttpResponseObject.js';
|
|
12
|
-
import {
|
|
12
|
+
import { PageContext_loadUserFilesServerSide, type PageFiles } from './loadUserFilesServerSide.js';
|
|
13
13
|
import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../../../shared/page-configs/PageConfig.js';
|
|
14
14
|
import { type PageRoutes } from '../../../shared/route/loadPageRoutes.js';
|
|
15
15
|
import type { Hook } from '../../../shared/hooks/getHook.js';
|
|
@@ -24,7 +24,7 @@ declare function renderPageAlreadyRouted<PageContext extends {
|
|
|
24
24
|
routeParams: Record<string, string>;
|
|
25
25
|
errorWhileRendering: null | Error;
|
|
26
26
|
_httpRequestId: number;
|
|
27
|
-
} & PageContextInitEnhanced & PageContextUrlComputedPropsInternal &
|
|
27
|
+
} & PageContextInitEnhanced & PageContextUrlComputedPropsInternal & PageContext_loadUserFilesServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
|
|
28
28
|
declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles & {
|
|
29
29
|
routeParams: Record<string, string>;
|
|
30
30
|
_pageId: string;
|
|
@@ -11,7 +11,7 @@ import { serializePageContextClientSide } from '../html/serializePageContextClie
|
|
|
11
11
|
import { addUrlComputedProps } from '../../../shared/addUrlComputedProps.js';
|
|
12
12
|
import { getGlobalContext } from '../globalContext.js';
|
|
13
13
|
import { createHttpResponseObject, createHttpResponsePageContextJson } from './createHttpResponseObject.js';
|
|
14
|
-
import {
|
|
14
|
+
import { loadUserFilesServerSide } from './loadUserFilesServerSide.js';
|
|
15
15
|
import { executeOnRenderHtmlHook } from './executeOnRenderHtmlHook.js';
|
|
16
16
|
import { executeOnBeforeRenderAndDataHooks } from './executeOnBeforeRenderAndDataHooks.js';
|
|
17
17
|
import { logRuntimeError } from './loggerRuntime.js';
|
|
@@ -21,6 +21,7 @@ import { executeGuardHook } from '../../../shared/route/executeGuardHook.js';
|
|
|
21
21
|
import { loadPageRoutes } from '../../../shared/route/loadPageRoutes.js';
|
|
22
22
|
import pc from '@brillout/picocolors';
|
|
23
23
|
import { getConfigValueFilePathToShowToUser } from '../../../shared/page-configs/helpers.js';
|
|
24
|
+
import { isRenderFailure } from '../../../shared/misc/isRenderFailure.js';
|
|
24
25
|
async function renderPageAlreadyRouted(pageContext) {
|
|
25
26
|
// pageContext._pageId can either be the:
|
|
26
27
|
// - ID of the page matching the routing, or the
|
|
@@ -28,7 +29,7 @@ async function renderPageAlreadyRouted(pageContext) {
|
|
|
28
29
|
assert(hasProp(pageContext, '_pageId', 'string'));
|
|
29
30
|
const isError = pageContext.is404 || !!pageContext.errorWhileRendering;
|
|
30
31
|
assert(isError === (pageContext._pageId === getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs)));
|
|
31
|
-
objectAssign(pageContext, await
|
|
32
|
+
objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
|
|
32
33
|
if (!isError) {
|
|
33
34
|
await executeGuardHook(pageContext, (pageContext) => preparePageContextForUserConsumptionServerSide(pageContext));
|
|
34
35
|
}
|
|
@@ -47,7 +48,7 @@ async function renderPageAlreadyRouted(pageContext) {
|
|
|
47
48
|
}
|
|
48
49
|
if (pageContext.isClientSideNavigation) {
|
|
49
50
|
if (isError) {
|
|
50
|
-
objectAssign(pageContext, {
|
|
51
|
+
objectAssign(pageContext, { [isRenderFailure]: true });
|
|
51
52
|
}
|
|
52
53
|
const pageContextSerialized = serializePageContextClientSide(pageContext);
|
|
53
54
|
const httpResponse = await createHttpResponsePageContextJson(pageContextSerialized);
|
|
@@ -112,7 +113,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
|
|
|
112
113
|
const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext);
|
|
113
114
|
objectAssign(pageContext, pageContextInitEnhanced);
|
|
114
115
|
}
|
|
115
|
-
objectAssign(pageContext, await
|
|
116
|
+
objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
|
|
116
117
|
return prerenderPage(pageContext);
|
|
117
118
|
}
|
|
118
119
|
function getPageContextInitEnhanced(pageContextInit, renderContext, { urlComputedPropsNonEnumerable = false, ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
|
|
@@ -16,7 +16,7 @@ import pc from '@brillout/picocolors';
|
|
|
16
16
|
import { serializePageContextAbort, serializePageContextClientSide } from './html/serializePageContextClientSide.js';
|
|
17
17
|
import { getErrorPageId } from '../../shared/error-page.js';
|
|
18
18
|
import { handleErrorWithoutErrorPage } from './renderPage/handleErrorWithoutErrorPage.js';
|
|
19
|
-
import {
|
|
19
|
+
import { loadUserFilesServerSide } from './renderPage/loadUserFilesServerSide.js';
|
|
20
20
|
import { resolveRedirects } from '../../shared/route/resolveRedirects.js';
|
|
21
21
|
const globalObject = getGlobalObject('runtime/renderPage.ts', {
|
|
22
22
|
httpRequestsCount: 0,
|
|
@@ -384,7 +384,7 @@ async function handleAbortError(errAbort, pageContextsFromRewrite, pageContextIn
|
|
|
384
384
|
...pageContextErrorPageInit,
|
|
385
385
|
...renderContext
|
|
386
386
|
};
|
|
387
|
-
objectAssign(pageContext, await
|
|
387
|
+
objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
|
|
388
388
|
// We include pageContextInit: we don't only serialize pageContextAbort because the error page may need to access pageContextInit
|
|
389
389
|
pageContextSerialized = serializePageContextClientSide(pageContext);
|
|
390
390
|
}
|
|
@@ -2,6 +2,7 @@ export { getHook };
|
|
|
2
2
|
export { getHookFromPageConfig };
|
|
3
3
|
export { getHookFromPageConfigGlobal };
|
|
4
4
|
export { assertHook };
|
|
5
|
+
export { setIsPrerenderering };
|
|
5
6
|
export type { Hook };
|
|
6
7
|
export type { HookName };
|
|
7
8
|
export type { HookLoc };
|
|
@@ -32,3 +33,4 @@ declare function assertHook<TPageContext extends PageContextExports, THookName e
|
|
|
32
33
|
exports: Record<THookName, Function | undefined>;
|
|
33
34
|
};
|
|
34
35
|
declare function getHookTimeoutDefault(hookName: HookName): HookTimeout;
|
|
36
|
+
declare function setIsPrerenderering(): void;
|
|
@@ -2,12 +2,17 @@ export { getHook };
|
|
|
2
2
|
export { getHookFromPageConfig };
|
|
3
3
|
export { getHookFromPageConfigGlobal };
|
|
4
4
|
export { assertHook };
|
|
5
|
+
export { setIsPrerenderering };
|
|
5
6
|
// TODO/v1-release: remove
|
|
6
7
|
// We export for old V0.4 design which doesn't support config.hooksTimeout
|
|
7
8
|
export { getHookTimeoutDefault };
|
|
9
|
+
import { getGlobalObject } from '../../utils/getGlobalObject.js';
|
|
8
10
|
import { getConfigValue, getHookFilePathToShowToUser } from '../page-configs/helpers.js';
|
|
9
11
|
import { assert, assertUsage, checkType, isCallable, isObject } from '../utils.js';
|
|
10
12
|
import pc from '@brillout/picocolors';
|
|
13
|
+
const globalObject = getGlobalObject('getHook.ts', {
|
|
14
|
+
isPrerendering: false
|
|
15
|
+
});
|
|
11
16
|
function getHook(pageContext, hookName) {
|
|
12
17
|
if (!(hookName in pageContext.exports)) {
|
|
13
18
|
return null;
|
|
@@ -110,19 +115,20 @@ function getHookTimeoutDefault(hookName) {
|
|
|
110
115
|
warning: 1 * 1000
|
|
111
116
|
};
|
|
112
117
|
}
|
|
113
|
-
if (
|
|
114
|
-
hookName === 'onBeforePrerenderStart' ||
|
|
115
|
-
// TODO/v1-release: remove
|
|
116
|
-
// Old V0.4 design hooks (https://vike.dev/migration/v1-design#renamed-hooks)
|
|
117
|
-
hookName === 'onBeforePrerender' ||
|
|
118
|
-
hookName === 'prerender') {
|
|
118
|
+
if (globalObject.isPrerendering) {
|
|
119
119
|
return {
|
|
120
|
-
error:
|
|
120
|
+
error: 2 * 60 * 1000,
|
|
121
121
|
warning: 30 * 1000
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
|
+
else {
|
|
125
|
+
assert(!hookName.toLowerCase().includes('prerender'));
|
|
126
|
+
}
|
|
124
127
|
return {
|
|
125
128
|
error: 30 * 1000,
|
|
126
129
|
warning: 4 * 1000
|
|
127
130
|
};
|
|
128
131
|
}
|
|
132
|
+
function setIsPrerenderering() {
|
|
133
|
+
globalObject.isPrerendering = true;
|
|
134
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isRenderFailure = "_isRenderFailure";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const isRenderFailure = '_isRenderFailure';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const pageContextInitIsPassedToClient = "_pageContextInitIsPassedToClient";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const pageContextInitIsPassedToClient = '_pageContextInitIsPassedToClient';
|
|
@@ -57,7 +57,7 @@ declare function render(abortStatusCode: 401 | 403 | 404 | 410 | 429 | 500 | 503
|
|
|
57
57
|
* @param abortReason Sets `pageContext.abortReason` which is used by the error page to show a message to the user, see https://vike.dev/error-page
|
|
58
58
|
*/
|
|
59
59
|
declare function render(url: `/${string}`, abortReason?: AbortReason): Error;
|
|
60
|
-
type AbortCall = `
|
|
60
|
+
type AbortCall = `redirect(${string})` | `render(${string})` | `RenderErrorPage()`;
|
|
61
61
|
type PageContextAbort = {
|
|
62
62
|
_abortCall: AbortCall;
|
|
63
63
|
} & (({
|
|
@@ -7,7 +7,7 @@ export { logAbortErrorHandled };
|
|
|
7
7
|
export { getPageContextFromAllRewrites };
|
|
8
8
|
export { AbortRender };
|
|
9
9
|
export { assertNoInfiniteAbortLoop };
|
|
10
|
-
import { assert, assertInfo, assertUsage, assertWarning, checkType, hasProp, joinEnglish, objectAssign, projectInfo, truncateString } from './utils.js';
|
|
10
|
+
import { assert, assertInfo, assertUsage, assertWarning, checkType, hasProp, isUserHookError, joinEnglish, objectAssign, projectInfo, truncateString } from './utils.js';
|
|
11
11
|
import pc from '@brillout/picocolors';
|
|
12
12
|
/**
|
|
13
13
|
* Abort the rendering of the current page, and redirect the user to another URL instead.
|
|
@@ -30,7 +30,7 @@ function redirect(url, statusCode) {
|
|
|
30
30
|
const pageContextAbort = {};
|
|
31
31
|
objectAssign(pageContextAbort, {
|
|
32
32
|
_abortCaller: abortCaller,
|
|
33
|
-
_abortCall: `
|
|
33
|
+
_abortCall: `redirect(${args.join(', ')})`,
|
|
34
34
|
_urlRedirect: {
|
|
35
35
|
url,
|
|
36
36
|
statusCode
|
|
@@ -43,7 +43,7 @@ function render(value, abortReason) {
|
|
|
43
43
|
if (abortReason !== undefined)
|
|
44
44
|
args.push(truncateString(JSON.stringify(abortReason), 30));
|
|
45
45
|
const abortCaller = 'throw render()';
|
|
46
|
-
const abortCall = `
|
|
46
|
+
const abortCall = `render(${args.join(', ')})`;
|
|
47
47
|
return render_(value, abortReason, abortCall, abortCaller);
|
|
48
48
|
}
|
|
49
49
|
function render_(value, abortReason, abortCall, abortCaller, pageContextAddendum) {
|
|
@@ -92,7 +92,7 @@ function RenderErrorPage({ pageContext = {} } = {}) {
|
|
|
92
92
|
abortReason = 'Something went wrong';
|
|
93
93
|
}
|
|
94
94
|
objectAssign(pageContext, { _isLegacyRenderErrorPage: true });
|
|
95
|
-
return render_(abortStatusCode, abortReason, '
|
|
95
|
+
return render_(abortStatusCode, abortReason, 'RenderErrorPage()', 'throw RenderErrorPage()', pageContext);
|
|
96
96
|
}
|
|
97
97
|
const stamp = '_isAbortError';
|
|
98
98
|
function isAbortError(thing) {
|
|
@@ -115,7 +115,18 @@ function logAbortErrorHandled(err, isProduction, pageContext) {
|
|
|
115
115
|
const urlCurrent = pageContext._urlRewrite ?? pageContext.urlOriginal;
|
|
116
116
|
assert(urlCurrent);
|
|
117
117
|
const abortCall = err._pageContextAbort._abortCall;
|
|
118
|
-
|
|
118
|
+
assert(abortCall);
|
|
119
|
+
const hookLoc = isUserHookError(err);
|
|
120
|
+
let thrownBy = '';
|
|
121
|
+
if (hookLoc) {
|
|
122
|
+
thrownBy = ` by ${pc.cyan(`${hookLoc.hookName}()`)} hook defined at ${hookLoc.hookFilePath}`;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// hookLoc is missing when serializing abort errors from server to client
|
|
126
|
+
}
|
|
127
|
+
assertInfo(false, `${pc.cyan(abortCall)} thrown${thrownBy} while rendering ${pc.cyan(urlCurrent)}`, {
|
|
128
|
+
onlyOnce: false
|
|
129
|
+
});
|
|
119
130
|
}
|
|
120
131
|
function assertStatusCode(statusCode, expected, caller) {
|
|
121
132
|
const expectedEnglish = joinEnglish(expected.map((s) => s.toString()), 'or');
|
|
@@ -16,7 +16,6 @@ pageFilesAll, pageConfigs, pageConfigGlobal, allPageIds) {
|
|
|
16
16
|
}
|
|
17
17
|
function getPageRoutes(filesystemRoots, pageFilesAll, pageConfigs, allPageIds) {
|
|
18
18
|
const pageRoutes = [];
|
|
19
|
-
let pageIds = [...allPageIds];
|
|
20
19
|
// V1 Design
|
|
21
20
|
if (pageConfigs.length > 0) {
|
|
22
21
|
assert(filesystemRoots === null);
|
|
@@ -25,7 +24,6 @@ function getPageRoutes(filesystemRoots, pageFilesAll, pageConfigs, allPageIds) {
|
|
|
25
24
|
.filter((p) => !p.isErrorPage)
|
|
26
25
|
.forEach((pageConfig) => {
|
|
27
26
|
const pageId = pageConfig.pageId;
|
|
28
|
-
pageIds = removePageId(pageIds, pageId);
|
|
29
27
|
let pageRoute = null;
|
|
30
28
|
{
|
|
31
29
|
const configName = 'route';
|
|
@@ -79,7 +77,7 @@ function getPageRoutes(filesystemRoots, pageFilesAll, pageConfigs, allPageIds) {
|
|
|
79
77
|
if (pageConfigs.length === 0) {
|
|
80
78
|
assert(filesystemRoots);
|
|
81
79
|
const comesFromV1PageConfig = false;
|
|
82
|
-
|
|
80
|
+
allPageIds
|
|
83
81
|
.filter((pageId) => !isErrorPageId(pageId, false))
|
|
84
82
|
.forEach((pageId) => {
|
|
85
83
|
const pageRouteFile = pageFilesAll.find((p) => p.pageId === pageId && p.fileType === '.page.route');
|
|
@@ -179,9 +177,3 @@ function dirname(filePath) {
|
|
|
179
177
|
assert(!dirPath.endsWith('/') || dirPath === '/');
|
|
180
178
|
return dirPath;
|
|
181
179
|
}
|
|
182
|
-
function removePageId(pageIds, pageId) {
|
|
183
|
-
const { length } = pageIds;
|
|
184
|
-
pageIds = pageIds.filter((id) => id !== pageId);
|
|
185
|
-
assert(pageIds.length === length - 1);
|
|
186
|
-
return pageIds;
|
|
187
|
-
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export { projectInfo };
|
|
2
2
|
export type { ProjectTag };
|
|
3
3
|
export { PROJECT_VERSION };
|
|
4
|
-
declare const PROJECT_VERSION: "0.4.
|
|
4
|
+
declare const PROJECT_VERSION: "0.4.153-commit-159c659";
|
|
5
5
|
type PackageName = typeof projectInfo.npmPackageName;
|
|
6
6
|
type ProjectVersion = typeof projectInfo.projectVersion;
|
|
7
7
|
type ProjectTag = `[${PackageName}]` | `[${PackageName}@${ProjectVersion}]`;
|
|
8
8
|
declare const projectInfo: {
|
|
9
9
|
projectName: "Vike";
|
|
10
|
-
projectVersion: "0.4.
|
|
10
|
+
projectVersion: "0.4.153-commit-159c659";
|
|
11
11
|
npmPackageName: "vike";
|
|
12
12
|
githubRepository: "https://github.com/vikejs/vike";
|
|
13
13
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { projectInfo };
|
|
2
2
|
export { PROJECT_VERSION };
|
|
3
3
|
import { onProjectInfo } from './assertSingleInstance.js';
|
|
4
|
-
const PROJECT_VERSION = '0.4.
|
|
4
|
+
const PROJECT_VERSION = '0.4.153-commit-159c659';
|
|
5
5
|
const projectInfo = {
|
|
6
6
|
projectName: 'Vike',
|
|
7
7
|
projectVersion: PROJECT_VERSION,
|
package/package.json
CHANGED