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
@@ -1,71 +1,50 @@
1
- export { getPageContextFromHooks_firstRender };
2
- export { getPageContextFromHooks_uponNavigation };
3
- export { getPageContextFromHooks_errorPage };
4
- export { isServerSideRouted as isServerSideRouted };
1
+ export { getPageContextFromHooks_isHydration };
2
+ export { getPageContextFromHooks_isNotHydration };
3
+ export { getPageContextFromHooks_serialized };
4
+ export { isServerSideRouted };
5
5
  import { assert, assertUsage, hasProp, objectAssign, getProjectError, serverSideRouteTo, executeHook, isObject, getGlobalObject } from './utils.js';
6
6
  import { parse } from '@brillout/json-serializer/parse';
7
7
  import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
8
8
  import { analyzePageServerSide } from '../../shared/getPageFiles/analyzePageServerSide.js';
9
- import { getErrorPageId } from '../../shared/error-page.js';
10
9
  import { getHook } from '../../shared/hooks/getHook.js';
11
10
  import { preparePageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
12
- import { loadPageFilesClientSide } from '../shared/loadPageFilesClientSide.js';
13
11
  import { removeBuiltInOverrides } from './getPageContext/removeBuiltInOverrides.js';
14
12
  import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
15
13
  import { getConfigValue, getPageConfig } from '../../shared/page-configs/helpers.js';
16
14
  import { assertOnBeforeRenderHookReturn } from '../../shared/assertOnBeforeRenderHookReturn.js';
17
15
  import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
18
16
  import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
17
+ import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
18
+ import { isRenderFailure } from '../../shared/misc/isRenderFailure.js';
19
19
  const globalObject = getGlobalObject('router/getPageContext.ts', {});
20
- async function getPageContextFromHooks_firstRender(pageContext) {
21
- const pageContextFromHooks = getPageContextSerializedInHtml();
22
- removeBuiltInOverrides(pageContextFromHooks);
23
- objectAssign(pageContextFromHooks, {
24
- isHydration: true,
25
- _hasPageContextFromClient: false
20
+ function getPageContextFromHooks_serialized() {
21
+ const pageContextSerialized = getPageContextSerializedInHtml();
22
+ processPageContextFromServer(pageContextSerialized);
23
+ objectAssign(pageContextSerialized, {
24
+ _hasPageContextFromServer: true
26
25
  });
27
- objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContextFromHooks._pageId, pageContext));
26
+ return pageContextSerialized;
27
+ }
28
+ async function getPageContextFromHooks_isHydration(pageContext) {
29
+ const pageContextFromHooks = {
30
+ isHydration: true,
31
+ _hasPageContextFromClient: false,
32
+ _hasPageContextFromServer: true
33
+ };
28
34
  for (const hookName of ['data', 'onBeforeRender']) {
29
35
  const pageContextForHook = { ...pageContext, ...pageContextFromHooks };
30
36
  if (hookClientOnlyExists(hookName, pageContextForHook)) {
31
37
  const pageContextFromHook = await executeHookClientSide(hookName, pageContextForHook);
32
- objectAssign(pageContextFromHooks, pageContextFromHook);
38
+ Object.assign(pageContextFromHooks, pageContextFromHook);
33
39
  }
34
40
  }
35
- setPageContextInitHasClientData(pageContextFromHooks);
36
41
  return pageContextFromHooks;
37
42
  }
38
- async function getPageContextFromHooks_errorPage(pageContext) {
39
- const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
40
- if (!errorPageId)
41
- throw new Error('No error page defined.');
43
+ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage) {
42
44
  const pageContextFromHooks = {
43
45
  isHydration: false,
44
- _pageId: errorPageId
45
- };
46
- objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, true));
47
- return pageContextFromHooks;
48
- }
49
- async function getPageContextFromHooks_uponNavigation(pageContext) {
50
- const pageContextFromHooks = {
51
- isHydration: false,
52
- _pageId: pageContext._pageId
53
- };
54
- objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, false));
55
- setPageContextInitHasClientData(pageContextFromHooks);
56
- return pageContextFromHooks;
57
- }
58
- async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
59
- const getPageContextFromHooksInit = async (pageId) => {
60
- const pageContextFromHooks = {
61
- _hasPageContextFromClient: false,
62
- _pageId: pageId
63
- };
64
- const pageContextFromPageFiles = await loadPageFilesClientSide(pageId, pageContext);
65
- objectAssign(pageContextFromHooks, pageContextFromPageFiles);
66
- return pageContextFromHooks;
46
+ _hasPageContextFromClient: false
67
47
  };
68
- let pageContextFromHooks = await getPageContextFromHooksInit(pageContext._pageId);
69
48
  let hasPageContextFromServer = false;
70
49
  // If pageContextInit has some client data or if one of the hooks guard(), data() or onBeforeRender() is server-side
71
50
  // only, then we need to fetch pageContext from the server.
@@ -77,19 +56,20 @@ async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
77
56
  (await hasPageContextServer({ ...pageContext, ...pageContextFromHooks }))) {
78
57
  const pageContextFromServer = await fetchPageContextFromServer(pageContext);
79
58
  hasPageContextFromServer = true;
80
- if (!pageContextFromServer['_isError']) {
59
+ if (!pageContextFromServer[isRenderFailure] || isErrorPage) {
81
60
  objectAssign(pageContextFromHooks, pageContextFromServer);
82
61
  }
83
62
  else {
84
- const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
85
- assert(errorPageId);
86
- pageContextFromHooks = await getPageContextFromHooksInit(errorPageId);
63
+ // When the user hasn't define a `_error.page.js` file: the mechanism with `serverSideError: true` is used instead
64
+ assert(!('serverSideError' in pageContextFromServer));
87
65
  assert(hasProp(pageContextFromServer, 'is404', 'boolean'));
88
66
  assert(hasProp(pageContextFromServer, 'pageProps', 'object'));
89
67
  assert(hasProp(pageContextFromServer.pageProps, 'is404', 'boolean'));
90
- // When the user hasn't define a `_error.page.js` file: the mechanism with `serverSideError: true` is used instead
91
- assert(!('serverSideError' in pageContextFromServer));
92
- objectAssign(pageContextFromHooks, pageContextFromServer);
68
+ objectAssign(pageContextFromServer, {
69
+ _hasPageContextFromServer: true,
70
+ _hasPageContextFromClient: false
71
+ });
72
+ return pageContextFromServer;
93
73
  }
94
74
  }
95
75
  // At this point, we need to call the client-side guard(), data() and onBeforeRender() hooks, if they exist on client
@@ -172,14 +152,14 @@ async function executeHookClientSide(hookName, pageContext) {
172
152
  // - We can show a warning to users when the pageContextInit keys aren't always the same. (We didn't implement the waning yet because it would require a new doc page https://vike.dev/pageContextInit#avoid-conditional-properties
173
153
  // - Workaround cannot be made completely reliable because the workaround assumes that passToClient is always the same, but the user may set a different passToClient value for another page
174
154
  // - Alternatively, we could define a new config `alwaysFetchPageContextFromServer: boolean`
175
- function setPageContextInitHasClientData(pageContext) {
176
- if (pageContext._pageContextInitHasClientData) {
177
- globalObject.pageContextInitHasClientData = true;
155
+ function setPageContextInitIsPassedToClient(pageContext) {
156
+ if (pageContext[pageContextInitIsPassedToClient]) {
157
+ globalObject.pageContextInitIsPassedToClient = true;
178
158
  }
179
159
  }
180
160
  // TODO/v1-release: make it sync
181
161
  async function hasPageContextServer(pageContext) {
182
- return (!!globalObject.pageContextInitHasClientData ||
162
+ return (!!globalObject.pageContextInitIsPassedToClient ||
183
163
  (await hookServerOnlyExists('data', pageContext)) ||
184
164
  (await hookServerOnlyExists('onBeforeRender', pageContext)));
185
165
  }
@@ -251,9 +231,13 @@ async function fetchPageContextFromServer(pageContext) {
251
231
  throw AbortRender(pageContextFromServer);
252
232
  }
253
233
  assert(hasProp(pageContextFromServer, '_pageId', 'string'));
254
- removeBuiltInOverrides(pageContextFromServer);
234
+ processPageContextFromServer(pageContextFromServer);
255
235
  return pageContextFromServer;
256
236
  }
237
+ function processPageContextFromServer(pageContextFromServer) {
238
+ setPageContextInitIsPassedToClient(pageContextFromServer);
239
+ removeBuiltInOverrides(pageContextFromServer);
240
+ }
257
241
  function isServerSideRouted(err) {
258
242
  return isObject(err) && !!err._alreadyServerSideRouted;
259
243
  }
@@ -1,2 +1,2 @@
1
1
  export { installClientRouter };
2
- declare function installClientRouter(): void;
2
+ declare function installClientRouter(): Promise<void>;
@@ -6,17 +6,23 @@ import { onBrowserHistoryNavigation } from './onBrowserHistoryNavigation.js';
6
6
  import { onLinkClick } from './onLinkClick.js';
7
7
  import { setupNativeScrollRestoration } from './scrollRestoration.js';
8
8
  import { autoSaveScrollPosition } from './setScrollPosition.js';
9
- function installClientRouter() {
9
+ async function installClientRouter() {
10
10
  setupNativeScrollRestoration();
11
11
  initHistoryState();
12
12
  autoSaveScrollPosition();
13
13
  monkeyPatchHistoryPushState();
14
14
  // First initial render
15
15
  assert(getRenderCount() === 0);
16
- renderPageClientSide({ scrollTarget: 'preserve-scroll', isBackwardNavigation: null, isClientSideNavigation: false });
16
+ const promise = renderPageClientSide({
17
+ scrollTarget: 'preserve-scroll',
18
+ isBackwardNavigation: null,
19
+ isClientSideNavigation: false
20
+ });
17
21
  assert(getRenderCount() === 1);
18
22
  // Intercept <a> links
19
23
  onLinkClick();
20
24
  // Handle back-/forward navigation
21
25
  onBrowserHistoryNavigation();
26
+ // Only for full stack straces
27
+ await promise;
22
28
  }
@@ -15,7 +15,7 @@ function onBrowserHistoryNavigation() {
15
15
  // - The popstate event is *only* triggered if `href` starts with '#' (even if `href` is '/#some-hash' while the current URL's pathname is '/' then the popstate still isn't triggered)
16
16
  // - By JavaScript: `location.hash = 'some-hash'`
17
17
  // - The `event` argument of `window.addEventListener('popstate', (event) => /*...*/)` is useless: the History API doesn't provide the previous state (the popped state), see https://stackoverflow.com/questions/48055323/is-history-state-always-the-same-as-popstate-event-state
18
- window.addEventListener('popstate', (ev) => {
18
+ window.addEventListener('popstate', async () => {
19
19
  const currentState = getState();
20
20
  const scrollTarget = currentState.historyState.scrollPosition || 'scroll-to-top-or-hash';
21
21
  const isUserLandPushStateNavigation = currentState.historyState.triggedBy === 'user';
@@ -48,7 +48,7 @@ function onBrowserHistoryNavigation() {
48
48
  }
49
49
  }
50
50
  else {
51
- renderPageClientSide({ scrollTarget, isBackwardNavigation, isUserLandPushStateNavigation });
51
+ await renderPageClientSide({ scrollTarget, isBackwardNavigation, isUserLandPushStateNavigation });
52
52
  }
53
53
  });
54
54
  }
@@ -6,7 +6,7 @@ import { renderPageClientSide } from './renderPageClientSide.js';
6
6
  function onLinkClick() {
7
7
  document.addEventListener('click', handler);
8
8
  }
9
- function handler(ev) {
9
+ async function handler(ev) {
10
10
  if (!isNormalLeftClick(ev))
11
11
  return;
12
12
  const linkTag = findLinkTag(ev.target);
@@ -19,7 +19,7 @@ function handler(ev) {
19
19
  ev.preventDefault();
20
20
  const keepScrollPosition = ![null, 'false'].includes(linkTag.getAttribute('keep-scroll-position'));
21
21
  const scrollTarget = keepScrollPosition ? 'preserve-scroll' : 'scroll-to-top-or-hash';
22
- renderPageClientSide({
22
+ await renderPageClientSide({
23
23
  scrollTarget,
24
24
  urlOriginal: url,
25
25
  isBackwardNavigation: false
@@ -1,7 +1,7 @@
1
1
  export { prefetch };
2
2
  export { addLinkPrefetchHandlers };
3
3
  import { assert, assertClientRouting, assertUsage, assertWarning, checkIfClientRouting, getGlobalObject, isExternalLink } from './utils.js';
4
- import { isErrorFetchingStaticAssets, loadPageFilesClientSide } from '../shared/loadPageFilesClientSide.js';
4
+ import { isErrorFetchingStaticAssets, loadUserFilesClientSide } from '../shared/loadUserFilesClientSide.js';
5
5
  import { skipLink } from './skipLink.js';
6
6
  import { getPrefetchSettings } from './prefetch/getPrefetchSettings.js';
7
7
  import { isAlreadyPrefetched, markAsAlreadyPrefetched } from './prefetch/alreadyPrefetched.js';
@@ -14,7 +14,7 @@ assertClientRouting();
14
14
  const globalObject = getGlobalObject('prefetch.ts', { linkPrefetchHandlerAdded: new Map() });
15
15
  async function prefetchAssets(pageId, pageContext) {
16
16
  try {
17
- await loadPageFilesClientSide(pageId, pageContext);
17
+ await loadUserFilesClientSide(pageId, pageContext._pageFilesAll, pageContext._pageConfigs);
18
18
  }
19
19
  catch (err) {
20
20
  if (isErrorFetchingStaticAssets(err)) {