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.
Files changed (63) hide show
  1. package/dist/cjs/node/cli/bin.js +2 -2
  2. package/dist/cjs/node/plugin/index.js +2 -2
  3. package/dist/cjs/node/plugin/plugins/autoFullBuild.js +2 -2
  4. package/dist/cjs/node/plugin/plugins/envVars.js +1 -1
  5. package/dist/cjs/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +4 -4
  6. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
  7. package/dist/cjs/node/prerender/index.js +1 -1
  8. package/dist/cjs/node/prerender/runPrerender.js +21 -13
  9. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +5 -3
  10. package/dist/cjs/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +5 -5
  11. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
  12. package/dist/cjs/node/runtime/renderPage.js +2 -2
  13. package/dist/cjs/shared/hooks/getHook.js +14 -8
  14. package/dist/cjs/shared/misc/isRenderFailure.js +4 -0
  15. package/dist/cjs/shared/misc/pageContextInitIsPassedToClient.js +4 -0
  16. package/dist/cjs/shared/route/abort.js +15 -4
  17. package/dist/cjs/shared/route/loadPageRoutes.js +1 -9
  18. package/dist/cjs/utils/projectInfo.js +1 -1
  19. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +27 -32
  20. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +39 -55
  21. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +1 -1
  22. package/dist/esm/client/client-routing-runtime/installClientRouter.js +8 -2
  23. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +2 -2
  24. package/dist/esm/client/client-routing-runtime/onLinkClick.js +2 -2
  25. package/dist/esm/client/client-routing-runtime/prefetch.js +2 -2
  26. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +209 -141
  27. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +2 -2
  28. package/dist/esm/client/server-routing-runtime/getPageContext.js +5 -4
  29. package/dist/esm/client/shared/getPageContextSerializedInHtml.d.ts +0 -1
  30. package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -4
  31. package/dist/esm/client/shared/{loadPageFilesClientSide.d.ts → loadUserFilesClientSide.d.ts} +7 -6
  32. package/dist/esm/client/shared/{loadPageFilesClientSide.js → loadUserFilesClientSide.js} +4 -4
  33. package/dist/esm/node/cli/bin.js +3 -3
  34. package/dist/esm/node/plugin/index.js +2 -2
  35. package/dist/esm/node/plugin/plugins/autoFullBuild.js +3 -3
  36. package/dist/esm/node/plugin/plugins/envVars.js +1 -1
  37. package/dist/esm/node/plugin/plugins/fileEnv.d.ts +3 -0
  38. package/dist/esm/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +3 -3
  39. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
  40. package/dist/esm/node/prerender/index.d.ts +1 -1
  41. package/dist/esm/node/prerender/index.js +1 -1
  42. package/dist/esm/node/prerender/runPrerender.d.ts +8 -8
  43. package/dist/esm/node/prerender/runPrerender.js +22 -14
  44. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +0 -1
  45. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +5 -3
  46. package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.d.ts → loadUserFilesServerSide.d.ts} +6 -6
  47. package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +4 -4
  48. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
  49. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
  50. package/dist/esm/node/runtime/renderPage.js +2 -2
  51. package/dist/esm/shared/hooks/getHook.d.ts +2 -0
  52. package/dist/esm/shared/hooks/getHook.js +13 -7
  53. package/dist/esm/shared/misc/isRenderFailure.d.ts +1 -0
  54. package/dist/esm/shared/misc/isRenderFailure.js +1 -0
  55. package/dist/esm/shared/misc/pageContextInitIsPassedToClient.d.ts +1 -0
  56. package/dist/esm/shared/misc/pageContextInitIsPassedToClient.js +1 -0
  57. package/dist/esm/shared/route/abort.d.ts +1 -1
  58. package/dist/esm/shared/route/abort.js +16 -5
  59. package/dist/esm/shared/route/loadPageRoutes.js +1 -9
  60. package/dist/esm/utils/projectInfo.d.ts +2 -2
  61. package/dist/esm/utils/projectInfo.js +1 -1
  62. package/package.json +1 -1
  63. 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 { assertFileEnv } from './plugins/assertFileEnv.js';
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
- assertFileEnv()
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 { prerenderFromAutoFullBuild, prerenderForceExit } from '../../prerender/runPrerender.js';
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
- prerenderForceExit();
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 prerenderFromAutoFullBuild({ viteConfig: configInline });
81
+ await runPrerenderFromAutoFullBuild({ viteConfig: configInline });
82
82
  forceExit = true;
83
83
  }
84
84
  }
@@ -7,7 +7,7 @@ function envVarsPlugin() {
7
7
  let envsAll;
8
8
  let config;
9
9
  return {
10
- name: 'vike:env',
10
+ name: 'vike:envVars',
11
11
  enforce: 'post',
12
12
  configResolved(config_) {
13
13
  config = config_;
@@ -0,0 +1,3 @@
1
+ export { fileEnv };
2
+ import type { Plugin } from 'vite';
3
+ declare function fileEnv(): Plugin;
@@ -1,13 +1,13 @@
1
- export { assertFileEnv };
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 assertFileEnv() {
6
+ function fileEnv() {
7
7
  let config;
8
8
  let isDev = false;
9
9
  return {
10
- name: 'vike:assertFileEnv',
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 { prerenderFromAPI as prerender } from './runPrerender.js';
1
+ export { runPrerenderFromAPI as prerender } from './runPrerender.js';
@@ -1 +1 @@
1
- export { prerenderFromAPI as prerender } from './runPrerender.js';
1
+ export { runPrerenderFromAPI as prerender } from './runPrerender.js';
@@ -1,7 +1,7 @@
1
- export { prerenderFromAPI };
2
- export { prerenderFromCLI };
3
- export { prerenderFromAutoFullBuild };
4
- export { prerenderForceExit };
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 prerenderFromAPI(options?: PrerenderOptions): Promise<void>;
51
- declare function prerenderFromCLI(options: PrerenderOptions): Promise<void>;
52
- declare function prerenderFromAutoFullBuild(options: PrerenderOptions): Promise<void>;
53
- declare function prerenderForceExit(): void;
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 { prerenderFromAPI };
2
- export { prerenderFromCLI };
3
- export { prerenderFromAutoFullBuild };
4
- export { prerenderForceExit };
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 { loadPageFilesServerSide } from '../runtime/renderPage/loadPageFilesServerSide.js';
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 prerenderFromAPI(options = {}) {
29
+ async function runPrerenderFromAPI(options = {}) {
30
30
  await runPrerender(options, 'prerender()');
31
31
  }
32
- async function prerenderFromCLI(options) {
32
+ async function runPrerenderFromCLI(options) {
33
33
  await runPrerender(options, '$ vike prerender');
34
34
  }
35
- async function prerenderFromAutoFullBuild(options) {
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 loadPageFilesServerSide(pageContext));
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 loadPageFilesServerSide(pageContext));
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 prerenderForceExit() {
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
- assertUsage(false, `${pc.cyan(pageContextAbort._abortCall)} intercepted while pre-rendering ${urlOr404} but ${pc.cyan(pageContextAbort._abortCaller)} isn't supported for pre-rendered pages`);
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
- '_pageContextInitHasClientData',
20
+ pageContextInitIsPassedToClient,
19
21
  '_pageId',
20
22
  'data' // for data() hook
21
23
  ];
22
- const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', '_isError'];
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._pageContextInitHasClientData = true;
33
+ pageContextClient._pageContextInitIsPassedToClient = true;
32
34
  }
33
35
  let pageContextSerialized;
34
36
  try {
@@ -1,20 +1,20 @@
1
- export { loadPageFilesServerSide };
1
+ export { loadUserFilesServerSide };
2
2
  export type { PageFiles };
3
- export type { PageContext_loadPageFilesServerSide };
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 PageContext_loadPageFilesServerSide = PageContextGetPageAssets & PageContextDebugRouteMatches & {
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 loadPageFilesServerSide>>;
15
- declare function loadPageFilesServerSide(pageContext: {
14
+ type PageFiles = PromiseType<ReturnType<typeof loadUserFilesServerSide>>;
15
+ declare function loadUserFilesServerSide(pageContext: {
16
16
  _pageId: string;
17
- } & PageContext_loadPageFilesServerSide): Promise<{
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>;
@@ -1,4 +1,4 @@
1
- export { loadPageFilesServerSide };
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 loadPageFilesServerSide(pageContext) {
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
- loadPageFiles(pageContext._pageFilesAll, pageConfig, pageContext._pageId, !getGlobalContext().isProduction),
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 loadPageFiles(pageFilesAll, pageConfig, pageId, isDev) {
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 { PageContext_loadPageFilesServerSide, type PageFiles } from './loadPageFilesServerSide.js';
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 & PageContext_loadPageFilesServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
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 { loadPageFilesServerSide } from './loadPageFilesServerSide.js';
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 loadPageFilesServerSide(pageContext));
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, { _isError: true });
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 loadPageFilesServerSide(pageContext));
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 { loadPageFilesServerSide } from './renderPage/loadPageFilesServerSide.js';
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 loadPageFilesServerSide(pageContext));
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 (hookName === 'onPrerenderStart' ||
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: 10 * 60 * 1000,
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 = `throw redirect(${string})` | `throw render(${string})` | `throw RenderErrorPage()`;
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: `throw redirect(${args.join(', ')})`,
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 = `throw render(${args.join(', ')})`;
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, 'throw RenderErrorPage()', 'throw RenderErrorPage()', pageContext);
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
- assertInfo(false, `${pc.cyan(abortCall)} intercepted while rendering ${pc.cyan(urlCurrent)}`, { onlyOnce: false });
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
- pageIds
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.152-commit-6f928f9";
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.152-commit-6f928f9";
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.152-commit-6f928f9';
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.152-commit-6f928f9",
3
+ "version": "0.4.153-commit-159c659",
4
4
  "scripts": {
5
5
  "dev": "tsc --watch",
6
6
  "build": "rimraf dist/ && pnpm run build:esm && pnpm run build:cjs",
@@ -1,3 +0,0 @@
1
- export { assertFileEnv };
2
- import type { Plugin } from 'vite';
3
- declare function assertFileEnv(): Plugin;