vike 0.4.152 → 0.4.153-commit-01ab602

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 (93) 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/importBuild/index.js +1 -1
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
  8. package/dist/cjs/node/prerender/index.js +1 -1
  9. package/dist/cjs/node/prerender/runPrerender.js +21 -13
  10. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +5 -3
  11. package/dist/cjs/node/runtime/html/stream.js +2 -1
  12. package/dist/cjs/node/runtime/renderPage/getPageAssets/retrieveAssetsDev.js +2 -1
  13. package/dist/cjs/node/runtime/renderPage/isNewError.js +1 -1
  14. package/dist/cjs/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +5 -5
  15. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
  16. package/dist/cjs/node/runtime/renderPage.js +2 -2
  17. package/dist/cjs/node/runtime/utils.js +1 -2
  18. package/dist/cjs/shared/hooks/getHook.js +14 -8
  19. package/dist/cjs/shared/misc/isRenderFailure.js +4 -0
  20. package/dist/cjs/shared/misc/pageContextInitIsPassedToClient.js +4 -0
  21. package/dist/cjs/shared/route/abort.js +15 -4
  22. package/dist/cjs/shared/route/loadPageRoutes.js +1 -9
  23. package/dist/cjs/utils/isSameErrorMessage.js +10 -0
  24. package/dist/cjs/utils/projectInfo.js +1 -1
  25. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +0 -1
  26. package/dist/esm/client/client-routing-runtime/createPageContext.js +0 -3
  27. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +28 -33
  28. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +42 -58
  29. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +1 -1
  30. package/dist/esm/client/client-routing-runtime/installClientRouter.js +8 -2
  31. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +2 -2
  32. package/dist/esm/client/client-routing-runtime/onLinkClick.js +2 -2
  33. package/dist/esm/client/client-routing-runtime/prefetch/getPrefetchSettings.d.ts +1 -3
  34. package/dist/esm/client/client-routing-runtime/prefetch/getPrefetchSettings.js +1 -1
  35. package/dist/esm/client/client-routing-runtime/prefetch.d.ts +0 -1
  36. package/dist/esm/client/client-routing-runtime/prefetch.js +2 -2
  37. package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +1 -1
  38. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +298 -204
  39. package/dist/esm/client/client-routing-runtime/utils.d.ts +1 -1
  40. package/dist/esm/client/client-routing-runtime/utils.js +1 -1
  41. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +2 -2
  42. package/dist/esm/client/server-routing-runtime/getPageContext.js +5 -4
  43. package/dist/esm/client/shared/executeOnRenderClientHook.d.ts +4 -2
  44. package/dist/esm/client/shared/getPageContextSerializedInHtml.d.ts +0 -1
  45. package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -4
  46. package/dist/esm/client/shared/{loadPageFilesClientSide.d.ts → loadUserFilesClientSide.d.ts} +7 -6
  47. package/dist/esm/client/shared/{loadPageFilesClientSide.js → loadUserFilesClientSide.js} +4 -4
  48. package/dist/esm/node/cli/bin.js +3 -3
  49. package/dist/esm/node/plugin/index.js +2 -2
  50. package/dist/esm/node/plugin/plugins/autoFullBuild.js +3 -3
  51. package/dist/esm/node/plugin/plugins/envVars.js +1 -1
  52. package/dist/esm/node/plugin/plugins/fileEnv.d.ts +3 -0
  53. package/dist/esm/node/plugin/plugins/{assertFileEnv.js → fileEnv.js} +3 -3
  54. package/dist/esm/node/plugin/plugins/importBuild/index.js +1 -1
  55. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -9
  56. package/dist/esm/node/prerender/index.d.ts +1 -1
  57. package/dist/esm/node/prerender/index.js +1 -1
  58. package/dist/esm/node/prerender/runPrerender.d.ts +8 -8
  59. package/dist/esm/node/prerender/runPrerender.js +22 -14
  60. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +0 -1
  61. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +5 -3
  62. package/dist/esm/node/runtime/html/stream.js +3 -2
  63. package/dist/esm/node/runtime/renderPage/getPageAssets/retrieveAssetsDev.js +2 -1
  64. package/dist/esm/node/runtime/renderPage/isNewError.js +2 -2
  65. package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.d.ts → loadUserFilesServerSide.d.ts} +6 -6
  66. package/dist/esm/node/runtime/renderPage/{loadPageFilesServerSide.js → loadUserFilesServerSide.js} +4 -4
  67. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
  68. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +5 -4
  69. package/dist/esm/node/runtime/renderPage.js +2 -2
  70. package/dist/esm/node/runtime/utils.d.ts +1 -2
  71. package/dist/esm/node/runtime/utils.js +1 -2
  72. package/dist/esm/shared/hooks/getHook.d.ts +2 -0
  73. package/dist/esm/shared/hooks/getHook.js +13 -7
  74. package/dist/esm/shared/misc/isRenderFailure.d.ts +1 -0
  75. package/dist/esm/shared/misc/isRenderFailure.js +1 -0
  76. package/dist/esm/shared/misc/pageContextInitIsPassedToClient.d.ts +1 -0
  77. package/dist/esm/shared/misc/pageContextInitIsPassedToClient.js +1 -0
  78. package/dist/esm/shared/page-configs/Config.d.ts +1 -1
  79. package/dist/esm/shared/route/abort.d.ts +1 -1
  80. package/dist/esm/shared/route/abort.js +16 -5
  81. package/dist/esm/shared/route/loadPageRoutes.js +1 -9
  82. package/dist/esm/utils/isSameErrorMessage.d.ts +2 -0
  83. package/dist/esm/utils/isSameErrorMessage.js +7 -0
  84. package/dist/esm/utils/projectInfo.d.ts +2 -2
  85. package/dist/esm/utils/projectInfo.js +1 -1
  86. package/package.json +2 -2
  87. package/dist/cjs/utils/dynamicImport.js +0 -8
  88. package/dist/cjs/utils/isEquivalentError.js +0 -18
  89. package/dist/esm/node/plugin/plugins/assertFileEnv.d.ts +0 -3
  90. package/dist/esm/utils/dynamicImport.d.ts +0 -2
  91. package/dist/esm/utils/dynamicImport.js +0 -4
  92. package/dist/esm/utils/isEquivalentError.d.ts +0 -2
  93. package/dist/esm/utils/isEquivalentError.js +0 -15
@@ -1,11 +1,11 @@
1
1
  export { getPageContext };
2
2
  declare function getPageContext(): Promise<{
3
3
  _pageId: string;
4
- _hasPageContextFromServer: true;
5
4
  } & {
6
5
  isHydration: true;
7
6
  isBackwardNavigation: null;
8
- _hasPageContextFromClient: boolean;
7
+ _hasPageContextFromServer: true;
8
+ _hasPageContextFromClient: false;
9
9
  } & {
10
10
  _pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
11
11
  _pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
@@ -1,7 +1,7 @@
1
1
  import { assertUsage, assertWarning, getCurrentUrl, objectAssign } from './utils.js';
2
2
  import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
3
3
  import { getPageFilesAll } from '../../shared/getPageFiles.js';
4
- import { loadPageFilesClientSide } from '../shared/loadPageFilesClientSide.js';
4
+ import { loadUserFilesClientSide } from '../shared/loadUserFilesClientSide.js';
5
5
  export { getPageContext };
6
6
  const urlFirst = getCurrentUrl({ withoutHash: true });
7
7
  async function getPageContext() {
@@ -9,9 +9,10 @@ async function getPageContext() {
9
9
  objectAssign(pageContext, {
10
10
  isHydration: true,
11
11
  isBackwardNavigation: null,
12
+ _hasPageContextFromServer: true,
12
13
  _hasPageContextFromClient: false
13
14
  });
14
- objectAssign(pageContext, await loadPageFiles(pageContext._pageId));
15
+ objectAssign(pageContext, await loadPageUserFiles(pageContext._pageId));
15
16
  assertPristineUrl();
16
17
  return pageContext;
17
18
  }
@@ -19,14 +20,14 @@ function assertPristineUrl() {
19
20
  const urlCurrent = getCurrentUrl({ withoutHash: true });
20
21
  assertUsage(urlFirst === urlCurrent, `The URL was manipulated before the hydration finished ('${urlFirst}' to '${urlCurrent}'). Ensure the hydration has finished before manipulating the URL. Consider using the onHydrationEnd() hook.`);
21
22
  }
22
- async function loadPageFiles(pageId) {
23
+ async function loadPageUserFiles(pageId) {
23
24
  const pageContextAddendum = {};
24
25
  const { pageFilesAll, pageConfigs } = await getPageFilesAll(true);
25
26
  objectAssign(pageContextAddendum, {
26
27
  _pageFilesAll: pageFilesAll,
27
28
  _pageConfigs: pageConfigs
28
29
  });
29
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageId, pageContextAddendum));
30
+ objectAssign(pageContextAddendum, await loadUserFilesClientSide(pageId, pageContextAddendum._pageFilesAll, pageContextAddendum._pageConfigs));
30
31
  pageFilesAll
31
32
  .filter((p) => p.fileType !== '.page.server')
32
33
  .forEach((p) => {
@@ -1,11 +1,13 @@
1
1
  export { executeOnRenderClientHook };
2
+ export type { PageContextBeforeRenderClient };
2
3
  import type { PageFile, PageContextExports } from '../../shared/getPageFiles.js';
3
4
  import { type PageContextForUserConsumptionClientSide } from './preparePageContextForUserConsumptionClientSide.js';
4
5
  import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
5
- declare function executeOnRenderClientHook<PC extends {
6
+ type PageContextBeforeRenderClient = {
6
7
  _pageFilesLoaded: PageFile[];
7
8
  urlOriginal?: string;
8
9
  urlPathname?: string;
9
10
  _pageId: string;
10
11
  _pageConfigs: PageConfigRuntime[];
11
- } & PageContextExports & PageContextForUserConsumptionClientSide>(pageContext: PC, isClientRouting: boolean): Promise<void>;
12
+ } & PageContextExports & PageContextForUserConsumptionClientSide;
13
+ declare function executeOnRenderClientHook<PC extends PageContextBeforeRenderClient>(pageContext: PC, isClientRouting: boolean): Promise<void>;
@@ -1,5 +1,4 @@
1
1
  export { getPageContextSerializedInHtml };
2
2
  declare function getPageContextSerializedInHtml(): {
3
3
  _pageId: string;
4
- _hasPageContextFromServer: true;
5
4
  };
@@ -1,5 +1,5 @@
1
1
  import { parse } from '@brillout/json-serializer/parse';
2
- import { hasProp, assert, assertUsage, objectAssign } from '../server-routing-runtime/utils.js';
2
+ import { hasProp, assert, assertUsage } from '../server-routing-runtime/utils.js';
3
3
  export { getPageContextSerializedInHtml };
4
4
  function getPageContextSerializedInHtml() {
5
5
  // elem should exist because:
@@ -15,8 +15,5 @@ function getPageContextSerializedInHtml() {
15
15
  assert(pageContextJson);
16
16
  const pageContextSerializedInHtml = parse(pageContextJson);
17
17
  assert(hasProp(pageContextSerializedInHtml, '_pageId', 'string'));
18
- objectAssign(pageContextSerializedInHtml, {
19
- _hasPageContextFromServer: true
20
- });
21
18
  return pageContextSerializedInHtml;
22
19
  }
@@ -1,13 +1,14 @@
1
- export { loadPageFilesClientSide };
1
+ export { loadUserFilesClientSide };
2
2
  export { isErrorFetchingStaticAssets };
3
- export type { PageContextPageFiles };
3
+ export type { PageContextUserFiles };
4
4
  import { type PageFile, type PageContextExports } from '../../shared/getPageFiles.js';
5
5
  import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
6
- type PageContextPageFiles = {
6
+ type PageContextUserFilesLoaded = PageContextExports & {
7
+ _pageFilesLoaded: PageFile[];
8
+ };
9
+ type PageContextUserFiles = {
7
10
  _pageFilesAll: PageFile[];
8
11
  _pageConfigs: PageConfigRuntime[];
9
12
  };
10
- declare function loadPageFilesClientSide(pageId: string, pageContext: PageContextPageFiles): Promise<PageContextExports & {
11
- _pageFilesLoaded: PageFile[];
12
- }>;
13
+ declare function loadUserFilesClientSide(pageId: string, pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[]): Promise<PageContextUserFilesLoaded>;
13
14
  declare function isErrorFetchingStaticAssets(err: unknown): boolean;
@@ -1,12 +1,12 @@
1
- export { loadPageFilesClientSide };
1
+ export { loadUserFilesClientSide };
2
2
  export { isErrorFetchingStaticAssets };
3
3
  import { getPageFilesClientSide, getExports } from '../../shared/getPageFiles.js';
4
4
  import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
5
5
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
6
6
  const stamp = '__whileFetchingAssets';
7
- async function loadPageFilesClientSide(pageId, pageContext) {
8
- const pageFilesClientSide = getPageFilesClientSide(pageContext._pageFilesAll, pageId);
9
- const pageConfig = findPageConfig(pageContext._pageConfigs, pageId);
7
+ async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
8
+ const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
9
+ const pageConfig = findPageConfig(pageConfigs, pageId);
10
10
  let pageConfigLoaded;
11
11
  // @ts-ignore Since dist/cjs/client/ is never used, we can ignore this error.
12
12
  const isDev = import.meta.env.DEV;
@@ -1,6 +1,6 @@
1
1
  import { cac } from 'cac';
2
2
  import { resolve } from 'path';
3
- import { prerenderFromCLI, prerenderForceExit } from '../prerender/runPrerender.js';
3
+ import { runPrerenderFromCLI, runPrerender_forceExit } from '../prerender/runPrerender.js';
4
4
  import { projectInfo, assertUsage } from './utils.js';
5
5
  const cli = cac(projectInfo.projectName);
6
6
  cli
@@ -10,8 +10,8 @@ cli
10
10
  assertOptions();
11
11
  const { partial, noExtraDir, base, parallel, outDir, configFile } = options;
12
12
  const root = options.root && resolve(options.root);
13
- await prerenderFromCLI({ partial, noExtraDir, base, root, parallel, outDir, configFile });
14
- prerenderForceExit();
13
+ await runPrerenderFromCLI({ partial, noExtraDir, base, root, parallel, outDir, configFile });
14
+ runPrerender_forceExit();
15
15
  });
16
16
  function assertOptions() {
17
17
  // Using process.argv because cac convert names to camelCase
@@ -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.
@@ -45,7 +45,7 @@ function getEntryCode(config, configVike) {
45
45
  ' setImportBuildGetters({',
46
46
  ` pageFiles: () => pageFiles,`,
47
47
  // TODO: rename clientManifest -> assetManifest
48
- ` clientManifest: () => { return ${ASSETS_MAP} },`,
48
+ ` clientManifest: () => (${ASSETS_MAP}),`,
49
49
  // TODO: rename pluginManifest -> vikeManifest
50
50
  ` pluginManifest: () => (${JSON.stringify(vikeManifest, null, 2)}),`,
51
51
  ' });',
@@ -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 {
@@ -19,8 +19,9 @@ export { streamReadableWebToString };
19
19
  export { streamPipeNodeToString };
20
20
  export { isStreamWritableWeb };
21
21
  export { isStreamWritableNode };
22
- import { assert, assertUsage, checkType, isObject, hasProp, objectAssign, capitalizeFirstLetter, assertWarning, isCallable, createDebugger, dynamicImport, isBug } from '../utils.js';
22
+ import { assert, assertUsage, checkType, isObject, hasProp, objectAssign, capitalizeFirstLetter, assertWarning, isCallable, createDebugger, isBug } from '../utils.js';
23
23
  import { getStreamFromReactStreaming, isStreamReactStreaming, streamReactStreamingToString } from './stream/react-streaming.js';
24
+ import { import_ } from '@brillout/import';
24
25
  import pc from '@brillout/picocolors';
25
26
  const debug = createDebugger('vike:stream');
26
27
  function isStreamReadableWeb(thing) {
@@ -753,7 +754,7 @@ function encodeForWebStream(thing) {
753
754
  }
754
755
  // Because of Cloudflare Workers, we cannot statically import the `stream` module, instead we dynamically import it.
755
756
  async function loadStreamNodeModule() {
756
- const streamModule = await dynamicImport('stream');
757
+ const streamModule = (await import_('stream')).default;
757
758
  const { Readable, Writable } = streamModule;
758
759
  return { Readable, Writable };
759
760
  }
@@ -43,7 +43,8 @@ function collectCss(mod, styleUrls, visitedModules, importer) {
43
43
  // - I believe some Vite plugins don't respect the \0 virtual module convention. What should we do then?
44
44
  // - https://github.com/vikejs/vike/issues/1327
45
45
  // - https://github.com/vikejs/vike/commit/3f7b9916dddc84e29e2c20d2b0df7211b6f1acbd
46
- styleUrls.add(`/@id/${mod.url.substring(1)}`);
46
+ // - https://github.com/vikejs/vike/issues/479#issuecomment-1870043943
47
+ styleUrls.add(`/@id/__x00__${mod.url.substring(1)}`);
47
48
  }
48
49
  else {
49
50
  // Is this useful? Maybe for virtual modules that don't respect the \0 virtual module convention?
@@ -1,12 +1,12 @@
1
1
  export { isNewError };
2
2
  export { setAlreadyLogged };
3
- import { getGlobalObject, isObject, isEquivalentError, warnIfErrorIsNotObject } from '../utils.js';
3
+ import { getGlobalObject, isObject, isSameErrorMessage, warnIfErrorIsNotObject } from '../utils.js';
4
4
  const globalObject = getGlobalObject('runtime/renderPage/isNewError.ts', {
5
5
  wasAlreadyLogged: new WeakSet()
6
6
  });
7
7
  function isNewError(errErrorPage, errNominalPage) {
8
8
  warnIfErrorIsNotObject(errErrorPage);
9
- return !isEquivalentError(errNominalPage, errErrorPage) || !hasAlreadyLogged(errNominalPage);
9
+ return !isSameErrorMessage(errNominalPage, errErrorPage) || !hasAlreadyLogged(errNominalPage);
10
10
  }
11
11
  function hasAlreadyLogged(err) {
12
12
  if (!isObject(err))
@@ -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
  }