vike 0.4.144-commit-de18325 → 0.4.145-commit-2520555

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 (74) hide show
  1. package/dist/cjs/node/plugin/plugins/buildConfig.js +1 -1
  2. package/dist/cjs/node/plugin/plugins/config/index.js +3 -3
  3. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +1 -1
  4. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +1 -1
  5. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +1 -1
  6. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +1 -1
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +5 -2
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -2
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +18 -6
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.js +2 -2
  11. package/dist/cjs/node/prerender/runPrerender.js +17 -8
  12. package/dist/cjs/node/runtime/renderPage/log404/index.js +2 -1
  13. package/dist/cjs/node/shared/getConfigVike.js +4 -1
  14. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +8 -5
  15. package/dist/cjs/shared/route/noRouteMatch.js +4 -0
  16. package/dist/cjs/utils/isExternalLink.js +7 -0
  17. package/dist/cjs/utils/onPageVisibilityChange.js +19 -0
  18. package/dist/cjs/utils/projectInfo.js +1 -1
  19. package/dist/esm/client/client-routing-runtime/createPageContext.js +0 -1
  20. package/dist/esm/client/client-routing-runtime/getBaseServer.d.ts +2 -1
  21. package/dist/esm/client/client-routing-runtime/getBaseServer.js +2 -1
  22. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +39 -0
  23. package/dist/esm/client/client-routing-runtime/{getPageContext.js → getPageContextFromHooks.js} +48 -74
  24. package/dist/esm/client/client-routing-runtime/history.js +9 -5
  25. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +0 -19
  26. package/dist/esm/client/client-routing-runtime/installClientRouter.js +11 -488
  27. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.d.ts +3 -3
  28. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +4 -7
  29. package/dist/esm/client/client-routing-runtime/navigate.js +2 -3
  30. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.d.ts +4 -0
  31. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +63 -0
  32. package/dist/esm/client/client-routing-runtime/onLinkClick.d.ts +2 -0
  33. package/dist/esm/client/client-routing-runtime/onLinkClick.js +40 -0
  34. package/dist/esm/client/client-routing-runtime/prefetch.js +7 -8
  35. package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +19 -0
  36. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +347 -0
  37. package/dist/esm/client/client-routing-runtime/scrollRestoration.d.ts +6 -0
  38. package/dist/esm/client/client-routing-runtime/scrollRestoration.js +25 -0
  39. package/dist/esm/client/client-routing-runtime/setScrollPosition.d.ts +7 -0
  40. package/dist/esm/client/client-routing-runtime/setScrollPosition.js +77 -0
  41. package/dist/esm/client/client-routing-runtime/skipLink.js +9 -4
  42. package/dist/esm/client/client-routing-runtime/utils.d.ts +2 -0
  43. package/dist/esm/client/client-routing-runtime/utils.js +2 -0
  44. package/dist/esm/node/plugin/plugins/buildConfig.js +2 -2
  45. package/dist/esm/node/plugin/plugins/config/index.js +4 -4
  46. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +2 -2
  47. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +1 -1
  48. package/dist/esm/node/plugin/plugins/importUserCode/index.js +1 -1
  49. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +1 -1
  50. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +2 -1
  51. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +6 -3
  52. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.d.ts +2 -2
  53. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -2
  54. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.d.ts +2 -2
  55. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +18 -6
  56. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.js +3 -3
  57. package/dist/esm/node/prerender/runPrerender.js +17 -8
  58. package/dist/esm/node/runtime/renderPage/log404/index.js +2 -1
  59. package/dist/esm/node/shared/getConfigVike.d.ts +2 -1
  60. package/dist/esm/node/shared/getConfigVike.js +4 -1
  61. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +9 -3
  62. package/dist/esm/shared/route/noRouteMatch.d.ts +1 -0
  63. package/dist/esm/shared/route/noRouteMatch.js +1 -0
  64. package/dist/esm/utils/onPageVisibilityChange.d.ts +4 -0
  65. package/dist/esm/utils/onPageVisibilityChange.js +16 -0
  66. package/dist/esm/utils/projectInfo.d.ts +1 -1
  67. package/dist/esm/utils/projectInfo.js +1 -1
  68. package/node/cli/bin-entry.js +1 -1
  69. package/package.json +1 -1
  70. package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +0 -28
  71. package/dist/esm/client/client-routing-runtime/navigationState.d.ts +0 -5
  72. package/dist/esm/client/client-routing-runtime/navigationState.js +0 -14
  73. /package/dist/esm/{client/client-routing-runtime → utils}/isExternalLink.d.ts +0 -0
  74. /package/dist/esm/{client/client-routing-runtime → utils}/isExternalLink.js +0 -0
@@ -1,13 +1,11 @@
1
- export { getPageContext };
2
- export { getPageContextErrorPage };
3
- export { checkIf404 };
1
+ export { getPageContextFromHooks_firstRender };
2
+ export { getPageContextFromHooks_uponNavigation };
3
+ export { getPageContextFromHooks_errorPage };
4
4
  export { isAlreadyServerSideRouted };
5
- import { navigationState } from './navigationState.js';
6
5
  import { assert, assertUsage, hasProp, objectAssign, getProjectError, serverSideRouteTo, executeHook, isObject, getGlobalObject } from './utils.js';
7
6
  import { parse } from '@brillout/json-serializer/parse';
8
7
  import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
9
8
  import { analyzePageServerSide } from '../../shared/getPageFiles/analyzePageServerSide.js';
10
- import { route } from '../../shared/route/index.js';
11
9
  import { getErrorPageId } from '../../shared/error-page.js';
12
10
  import { getHook } from '../../shared/hooks/getHook.js';
13
11
  import { preparePageContextForUserConsumptionClientSide } from '../shared/preparePageContextForUserConsumptionClientSide.js';
@@ -19,85 +17,75 @@ import { assertOnBeforeRenderHookReturn } from '../../shared/assertOnBeforeRende
19
17
  import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
20
18
  import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
21
19
  const globalObject = getGlobalObject('router/getPageContext.ts', {});
22
- async function getPageContext(pageContext) {
23
- if (pageContext._isFirstRenderAttempt && navigationState.isFirstUrl(pageContext.urlOriginal)) {
24
- const pageContextAddendum = await getPageContextFirstRender(pageContext);
25
- setPageContextInitHasClientData(pageContextAddendum);
26
- return pageContextAddendum;
27
- }
28
- else {
29
- const pageContextAddendum = await getPageContextUponNavigation(pageContext);
30
- setPageContextInitHasClientData(pageContextAddendum);
31
- return pageContextAddendum;
32
- }
33
- }
34
- async function getPageContextFirstRender(pageContext) {
35
- const pageContextAddendum = getPageContextSerializedInHtml();
36
- removeBuiltInOverrides(pageContextAddendum);
37
- objectAssign(pageContextAddendum, {
20
+ async function getPageContextFromHooks_firstRender(pageContext) {
21
+ const pageContextFromHooks = getPageContextSerializedInHtml();
22
+ removeBuiltInOverrides(pageContextFromHooks);
23
+ objectAssign(pageContextFromHooks, {
38
24
  isHydration: true,
39
25
  _hasPageContextFromClient: false
40
26
  });
41
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContextAddendum._pageId, pageContext));
27
+ objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContextFromHooks._pageId, pageContext));
42
28
  {
43
- const pageContextForHook = { ...pageContext, ...pageContextAddendum };
29
+ const pageContextForHook = { ...pageContext, ...pageContextFromHooks };
44
30
  if (await onBeforeRenderClientOnlyExists(pageContextForHook)) {
45
31
  const pageContextFromHook = await executeOnBeforeRenderHookClientSide(pageContextForHook);
46
- objectAssign(pageContextAddendum, pageContextFromHook);
32
+ objectAssign(pageContextFromHooks, pageContextFromHook);
47
33
  }
48
34
  }
49
- return pageContextAddendum;
35
+ setPageContextInitHasClientData(pageContextFromHooks);
36
+ return pageContextFromHooks;
50
37
  }
51
- async function getPageContextErrorPage(pageContext) {
38
+ async function getPageContextFromHooks_errorPage(pageContext) {
52
39
  const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
53
40
  if (!errorPageId)
54
41
  throw new Error('No error page defined.');
55
- const pageContextAddendum = {
42
+ const pageContextFromHooks = {
56
43
  isHydration: false,
57
44
  _pageId: errorPageId
58
45
  };
59
- objectAssign(pageContextAddendum, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextAddendum }, true));
60
- return pageContextAddendum;
46
+ objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, true));
47
+ return pageContextFromHooks;
61
48
  }
62
- async function getPageContextUponNavigation(pageContext) {
63
- const pageContextAddendum = {
64
- isHydration: false
49
+ async function getPageContextFromHooks_uponNavigation(pageContext) {
50
+ const pageContextFromHooks = {
51
+ isHydration: false,
52
+ _pageId: pageContext._pageId
65
53
  };
66
- objectAssign(pageContextAddendum, await getPageContextFromRoute(pageContext));
67
- objectAssign(pageContextAddendum, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextAddendum }, false));
68
- return pageContextAddendum;
54
+ objectAssign(pageContextFromHooks, await getPageContextAlreadyRouted({ ...pageContext, ...pageContextFromHooks }, false));
55
+ setPageContextInitHasClientData(pageContextFromHooks);
56
+ return pageContextFromHooks;
69
57
  }
70
58
  async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
71
- let pageContextAddendum = {};
72
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContext._pageId, pageContext));
59
+ let pageContextFromHooks = {};
60
+ objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContext._pageId, pageContext));
73
61
  // Needs to be called before any client-side hook, because it may contain pageContextInit.user which is needed for guard() and onBeforeRender()
74
62
  if (
75
63
  // For the error page, we cannot fetch pageContext from the server because the pageContext JSON request is based on the URL
76
64
  !isErrorPage &&
77
- (await hasPageContextServer({ ...pageContext, ...pageContextAddendum }))) {
65
+ (await hasPageContextServer({ ...pageContext, ...pageContextFromHooks }))) {
78
66
  const pageContextFromServer = await fetchPageContextFromServer(pageContext);
79
67
  if (!pageContextFromServer['_isError']) {
80
- objectAssign(pageContextAddendum, pageContextFromServer);
68
+ objectAssign(pageContextFromHooks, pageContextFromServer);
81
69
  }
82
70
  else {
83
71
  const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
84
72
  assert(errorPageId);
85
- pageContextAddendum = {};
86
- objectAssign(pageContextAddendum, {
73
+ pageContextFromHooks = {};
74
+ objectAssign(pageContextFromHooks, {
87
75
  isHydration: false,
88
76
  _pageId: errorPageId
89
77
  });
90
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContextAddendum._pageId, pageContext));
78
+ objectAssign(pageContextFromHooks, await loadPageFilesClientSide(pageContextFromHooks._pageId, pageContext));
91
79
  assert(hasProp(pageContextFromServer, 'is404', 'boolean'));
92
80
  assert(hasProp(pageContextFromServer, 'pageProps', 'object'));
93
81
  assert(hasProp(pageContextFromServer.pageProps, 'is404', 'boolean'));
94
82
  // When the user hasn't define a `_error.page.js` file: the mechanism with `serverSideError: true` is used instead
95
83
  assert(!('serverSideError' in pageContextFromServer));
96
- objectAssign(pageContextAddendum, pageContextFromServer);
84
+ objectAssign(pageContextFromHooks, pageContextFromServer);
97
85
  }
98
86
  }
99
87
  else {
100
- objectAssign(pageContextAddendum, { _hasPageContextFromServer: false });
88
+ objectAssign(pageContextFromHooks, { _hasPageContextFromServer: false });
101
89
  // We don't need to call guard() on the client-side if we fetch pageContext from the server side. (Because the `${url}.pageContext.json` HTTP request will already trigger the routing and guard() hook on the serve-side.)
102
90
  // We cannot call guard() before retrieving pageContext from server, since the server-side may define pageContextInit.user which is paramount for guard() hooks
103
91
  if (!isErrorPage) {
@@ -105,41 +93,41 @@ async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
105
93
  await executeGuardHook({
106
94
  _hasPageContextFromClient: false,
107
95
  ...pageContext,
108
- ...pageContextAddendum
96
+ ...pageContextFromHooks
109
97
  }, (pageContext) => preparePageContextForUserConsumptionClientSide(pageContext, true));
110
98
  }
111
99
  }
112
100
  {
113
101
  // For the error page, we also execute the client-side onBeforeRender() hook, but maybe we shouldn't? The server-side does it as well (but maybe it shouldn't).
114
- const pageContextFromHook = await executeOnBeforeRenderHookClientSide({ ...pageContext, ...pageContextAddendum });
115
- objectAssign(pageContextAddendum, pageContextFromHook);
102
+ const pageContextFromOnBeforeRender = await executeOnBeforeRenderHookClientSide({
103
+ ...pageContext,
104
+ ...pageContextFromHooks
105
+ });
106
+ objectAssign(pageContextFromHooks, pageContextFromOnBeforeRender);
116
107
  }
117
- return pageContextAddendum;
108
+ return pageContextFromHooks;
118
109
  }
119
110
  async function executeOnBeforeRenderHookClientSide(pageContext) {
120
111
  const hook = getHook(pageContext, 'onBeforeRender');
121
112
  if (!hook) {
122
- const pageContextAddendum = {
113
+ const pageContextFromOnBeforeRender = {
123
114
  _hasPageContextFromClient: false
124
115
  };
125
- return pageContextAddendum;
116
+ return pageContextFromOnBeforeRender;
126
117
  }
127
118
  const onBeforeRender = hook.hookFn;
128
- const pageContextAddendum = {
119
+ const pageContextFromOnBeforeRender = {
129
120
  _hasPageContextFromClient: true
130
121
  };
131
122
  const pageContextForUserConsumption = preparePageContextForUserConsumptionClientSide({
132
123
  ...pageContext,
133
- ...pageContextAddendum
124
+ ...pageContextFromOnBeforeRender
134
125
  }, true);
135
126
  const hookResult = await executeHook(() => onBeforeRender(pageContextForUserConsumption), 'onBeforeRender', hook.hookFilePath);
136
127
  assertOnBeforeRenderHookReturn(hookResult, hook.hookFilePath);
137
128
  const pageContextFromHook = hookResult?.pageContext;
138
- objectAssign(pageContextAddendum, pageContextFromHook);
139
- return pageContextAddendum;
140
- }
141
- async function hasPageContextServer(pageContext) {
142
- return !!globalObject.pageContextInitHasClientData || (await onBeforeRenderServerOnlyExists(pageContext));
129
+ objectAssign(pageContextFromOnBeforeRender, pageContextFromHook);
130
+ return pageContextFromOnBeforeRender;
143
131
  }
144
132
  // Workaround for the fact that the client-side cannot known whether a pageContext JSON request is needed in order to fetch pageContextInit data passed to the client.
145
133
  // - The workaround is reliable as long as the user sets additional pageContextInit to undefined instead of not defining the property:
@@ -158,6 +146,9 @@ function setPageContextInitHasClientData(pageContext) {
158
146
  globalObject.pageContextInitHasClientData = true;
159
147
  }
160
148
  }
149
+ async function hasPageContextServer(pageContext) {
150
+ return !!globalObject.pageContextInitHasClientData || (await onBeforeRenderServerOnlyExists(pageContext));
151
+ }
161
152
  async function onBeforeRenderServerOnlyExists(pageContext) {
162
153
  if (pageContext._pageConfigs.length > 0) {
163
154
  // V1
@@ -182,23 +173,6 @@ async function onBeforeRenderClientOnlyExists(pageContext) {
182
173
  return false;
183
174
  }
184
175
  }
185
- async function getPageContextFromRoute(pageContext) {
186
- const pageContextFromRoute = await route(pageContext);
187
- // We'll be able to remove this once async route functions are deprecated (because we'll be able to skip link hijacking if a link doesn't match a route (because whether to call event.preventDefault() needs to be determined synchronously))
188
- if (!pageContextFromRoute._pageId) {
189
- const err = new Error('No routing match');
190
- markIs404(err);
191
- throw err;
192
- }
193
- assert(hasProp(pageContextFromRoute, '_pageId', 'string'));
194
- return pageContextFromRoute;
195
- }
196
- function markIs404(err) {
197
- objectAssign(err, { _is404: true });
198
- }
199
- function checkIf404(err) {
200
- return isObject(err) && err._is404 === true;
201
- }
202
176
  async function fetchPageContextFromServer(pageContext) {
203
177
  const pageContextUrl = getPageContextRequestUrl(pageContext._urlRewrite ?? pageContext.urlOriginal);
204
178
  const response = await fetch(pageContextUrl);
@@ -1,5 +1,6 @@
1
1
  export { initHistoryState, getHistoryState, pushHistory, saveScrollPosition, monkeyPatchHistoryPushState };
2
- import { assert, assertUsage, hasProp, isObject } from './utils.js';
2
+ import { assert, assertUsage, getGlobalObject, hasProp, isObject } from './utils.js';
3
+ const globalObject = getGlobalObject('history.ts', {});
3
4
  // Fill missing state information:
4
5
  // - `history.state` can uninitialized (i.e. `null`):
5
6
  // - The very first render
@@ -71,11 +72,11 @@ function replaceHistoryState(state, url) {
71
72
  window.history.replaceState(state, '', url ?? /* Passing `undefined` chokes older Edge versions */ null);
72
73
  }
73
74
  function pushHistoryState(state, url) {
74
- window.history.pushState(state, '', url);
75
+ pushStateOriginal(state, '', url);
75
76
  }
76
77
  function monkeyPatchHistoryPushState() {
77
- const pushStateOriginal = history.pushState;
78
- history.pushState = (stateFromUser = {}, ...rest) => {
78
+ globalObject.pushStateOriginal = globalObject.pushStateOriginal ?? window.history.pushState;
79
+ window.history.pushState = (stateFromUser = {}, ...rest) => {
79
80
  assertUsage(null === stateFromUser || undefined === stateFromUser || isObject(stateFromUser), 'history.pushState(state) argument state must be an object');
80
81
  const state = {
81
82
  scrollPosition: getScrollPosition(),
@@ -84,6 +85,9 @@ function monkeyPatchHistoryPushState() {
84
85
  // Don't allow user to overwrite triggedBy as it would break Vike's handling of the 'popstate' event
85
86
  triggedBy: 'user'
86
87
  };
87
- return pushStateOriginal.apply(history, [state, ...rest]);
88
+ return pushStateOriginal(state, ...rest);
88
89
  };
89
90
  }
91
+ function pushStateOriginal(...args) {
92
+ globalObject.pushStateOriginal.apply(history, args);
93
+ }
@@ -1,21 +1,2 @@
1
1
  export { installClientRouter };
2
- export { disableClientRouting };
3
- export { isDisableAutomaticLinkInterception };
4
- export { renderPageClientSide };
5
- import { ScrollPosition } from './history.js';
6
- import { PageContextFromRewrite } from '../../shared/route/abort.js';
7
2
  declare function installClientRouter(): void;
8
- type RenderArgs = {
9
- scrollTarget: ScrollTarget;
10
- isBackwardNavigation: boolean | null;
11
- urlOriginal?: string;
12
- overwriteLastHistoryEntry?: boolean;
13
- checkIfClientSideRenderable?: boolean;
14
- pageContextsFromRewrite?: PageContextFromRewrite[];
15
- redirectCount?: number;
16
- isUserLandNavigation?: boolean;
17
- };
18
- declare function renderPageClientSide(renderArgs: RenderArgs): Promise<void>;
19
- type ScrollTarget = ScrollPosition | 'scroll-to-top-or-hash' | 'preserve-scroll';
20
- declare function isDisableAutomaticLinkInterception(): boolean;
21
- declare function disableClientRouting(err: unknown, log: boolean): void;