vike 0.4.196-commit-df033dd → 0.4.197-commit-9db6c02

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 (120) hide show
  1. package/dist/cjs/client/client-routing-runtime/prefetch/PrefetchSetting.js +2 -0
  2. package/dist/cjs/client/server-routing-runtime/onLoad.js +7 -0
  3. package/dist/cjs/client/server-routing-runtime/utils.js +34 -0
  4. package/dist/cjs/client/shared/getPageContextProxyForUser.js +79 -0
  5. package/dist/cjs/client/shared/preparePageContextForUserConsumptionClientSide.js +46 -0
  6. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +17 -1
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +26 -23
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/{transformFileImports.js → transformPointerImports.js} +3 -4
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +44 -47
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -1
  12. package/dist/cjs/node/prerender/runPrerender.js +5 -5
  13. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +1 -1
  14. package/dist/cjs/node/runtime/html/injectAssets/injectAssets__public.js +1 -1
  15. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +2 -2
  16. package/dist/cjs/node/runtime/renderPage/createHttpResponse.js +3 -3
  17. package/dist/cjs/node/runtime/renderPage/debugPageFiles.js +1 -1
  18. package/dist/cjs/node/runtime/renderPage/handleErrorWithoutErrorPage.js +1 -1
  19. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -4
  20. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -7
  21. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +4 -4
  22. package/dist/cjs/node/runtime/renderPage.js +8 -8
  23. package/dist/cjs/shared/addIs404ToPageProps.js +1 -1
  24. package/dist/cjs/shared/assertPageContextProvidedByUser.js +1 -1
  25. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +2 -2
  26. package/dist/cjs/shared/preparePageContextForUserConsumption.js +34 -0
  27. package/dist/cjs/shared/route/executeGuardHook.js +1 -1
  28. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +6 -6
  29. package/dist/cjs/shared/route/index.js +3 -3
  30. package/dist/cjs/shared/route/resolveRouteString.js +10 -1
  31. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  32. package/dist/cjs/utils/isNpmPackage.js +4 -0
  33. package/dist/cjs/utils/isScriptFile.js +3 -3
  34. package/dist/esm/client/client-routing-runtime/entry.js +2 -2
  35. package/dist/esm/client/client-routing-runtime/getPageContextCurrent.d.ts +10 -0
  36. package/dist/esm/client/client-routing-runtime/getPageContextCurrent.js +25 -0
  37. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +28 -18
  38. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +39 -32
  39. package/dist/esm/client/client-routing-runtime/history.js +1 -1
  40. package/dist/esm/client/client-routing-runtime/initClientRouter.d.ts +2 -0
  41. package/dist/esm/client/client-routing-runtime/{installClientRouter.js → initClientRouter.js} +11 -8
  42. package/dist/esm/client/client-routing-runtime/initOnLinkClick.d.ts +2 -0
  43. package/dist/esm/client/client-routing-runtime/{onLinkClick.js → initOnLinkClick.js} +2 -2
  44. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +1 -0
  45. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +1 -1
  46. package/dist/esm/client/client-routing-runtime/prefetch/PrefetchSetting.d.ts +7 -0
  47. package/dist/esm/client/client-routing-runtime/prefetch/PrefetchSetting.js +1 -0
  48. package/dist/esm/client/client-routing-runtime/prefetch/getPrefetchSettings.d.ts +8 -7
  49. package/dist/esm/client/client-routing-runtime/prefetch/getPrefetchSettings.js +74 -67
  50. package/dist/esm/client/client-routing-runtime/prefetch.d.ts +16 -5
  51. package/dist/esm/client/client-routing-runtime/prefetch.js +167 -64
  52. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +115 -28
  53. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +1 -1
  54. package/dist/esm/client/server-routing-runtime/getPageContext.js +1 -1
  55. package/dist/esm/client/shared/executeOnRenderClientHook.d.ts +1 -1
  56. package/dist/esm/client/shared/getPageContextSerializedInHtml.d.ts +1 -1
  57. package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -1
  58. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +1 -1
  59. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.js +20 -29
  60. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +17 -1
  61. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +1 -1
  62. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.d.ts +1 -1
  63. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +25 -22
  64. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/{transformFileImports.d.ts → transformPointerImports.d.ts} +2 -2
  65. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/{transformFileImports.js → transformPointerImports.js} +3 -4
  66. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +45 -48
  67. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +1 -1
  68. package/dist/esm/node/prerender/runPrerender.js +5 -5
  69. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +1 -1
  70. package/dist/esm/node/runtime/html/injectAssets/injectAssets__public.js +1 -1
  71. package/dist/esm/node/runtime/html/injectAssets.d.ts +1 -1
  72. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +1 -1
  73. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +2 -2
  74. package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +1 -1
  75. package/dist/esm/node/runtime/renderPage/createHttpResponse.js +3 -3
  76. package/dist/esm/node/runtime/renderPage/debugPageFiles.d.ts +1 -1
  77. package/dist/esm/node/runtime/renderPage/debugPageFiles.js +1 -1
  78. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +1 -1
  79. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.d.ts +1 -1
  80. package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.d.ts +1 -1
  81. package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.js +1 -1
  82. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -1
  83. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -4
  84. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +1 -1
  85. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +3 -8
  86. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +6 -6
  87. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +4 -4
  88. package/dist/esm/node/runtime/renderPage.js +8 -8
  89. package/dist/esm/shared/addIs404ToPageProps.d.ts +1 -1
  90. package/dist/esm/shared/addIs404ToPageProps.js +1 -1
  91. package/dist/esm/shared/assertPageContextProvidedByUser.js +1 -1
  92. package/dist/esm/shared/page-configs/Config.d.ts +21 -1
  93. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +1 -1
  94. package/dist/esm/shared/preparePageContextForUserConsumption.d.ts +5 -0
  95. package/dist/esm/shared/preparePageContextForUserConsumption.js +32 -0
  96. package/dist/esm/shared/route/executeGuardHook.d.ts +1 -1
  97. package/dist/esm/shared/route/executeGuardHook.js +1 -1
  98. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +6 -6
  99. package/dist/esm/shared/route/index.d.ts +1 -1
  100. package/dist/esm/shared/route/index.js +3 -3
  101. package/dist/esm/shared/route/resolveRouteString.d.ts +2 -15
  102. package/dist/esm/shared/route/resolveRouteString.js +10 -1
  103. package/dist/esm/shared/types.d.ts +6 -2
  104. package/dist/esm/types/index.d.ts +1 -1
  105. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  106. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  107. package/dist/esm/utils/isNpmPackage.d.ts +2 -0
  108. package/dist/esm/utils/isNpmPackage.js +4 -0
  109. package/dist/esm/utils/isScriptFile.d.ts +2 -2
  110. package/dist/esm/utils/isScriptFile.js +3 -3
  111. package/dist/esm/utils/projectInfo.d.ts +1 -1
  112. package/package.json +1 -1
  113. package/dist/cjs/shared/sortPageContext.js +0 -12
  114. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +0 -2
  115. package/dist/esm/client/client-routing-runtime/onLinkClick.d.ts +0 -2
  116. package/dist/esm/client/client-routing-runtime/prefetch/alreadyPrefetched.d.ts +0 -4
  117. package/dist/esm/client/client-routing-runtime/prefetch/alreadyPrefetched.js +0 -16
  118. package/dist/esm/shared/sortPageContext.d.ts +0 -2
  119. package/dist/esm/shared/sortPageContext.js +0 -10
  120. /package/{readme.md → README.md} +0 -0
@@ -1,6 +1,8 @@
1
1
  export { getPageContextFromHooks_isHydration };
2
- export { getPageContextFromHooks_isNotHydration };
3
2
  export { getPageContextFromHooks_serialized };
3
+ export { getPageContextFromServerHooks };
4
+ export { getPageContextFromClientHooks };
5
+ export { setPageContextInitIsPassedToClient };
4
6
  import { assert, assertUsage, hasProp, objectAssign, getProjectError, redirectHard, executeHook, isObject, getGlobalObject } from './utils.js';
5
7
  import { parse } from '@brillout/json-serializer/parse';
6
8
  import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
@@ -17,6 +19,7 @@ import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
17
19
  import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
18
20
  import { isServerSideError } from '../../shared/misc/isServerSideError.js';
19
21
  const globalObject = getGlobalObject('router/getPageContext.ts', {});
22
+ // TODO/eventually: rename
20
23
  function getPageContextFromHooks_serialized() {
21
24
  const pageContextSerialized = getPageContextSerializedInHtml();
22
25
  assertUsage(!('urlOriginal' in pageContextSerialized), "Adding 'urlOriginal' to passToClient is forbidden");
@@ -26,28 +29,27 @@ function getPageContextFromHooks_serialized() {
26
29
  });
27
30
  return pageContextSerialized;
28
31
  }
32
+ // TODO/eventually: rename
29
33
  async function getPageContextFromHooks_isHydration(pageContext) {
30
34
  objectAssign(pageContext, {
31
35
  isHydration: true,
32
- _hasPageContextFromClient: false,
33
- _hasPageContextFromServer: true
36
+ _hasPageContextFromClient: false
34
37
  });
35
38
  for (const hookName of ['data', 'onBeforeRender']) {
36
39
  if (hookClientOnlyExists(hookName, pageContext)) {
37
40
  const pageContextFromHook = await executeHookClientSide(hookName, pageContext);
38
- if (pageContextFromHook)
39
- assert(!('urlOriginal' in pageContextFromHook));
41
+ assert(!('urlOriginal' in pageContextFromHook));
40
42
  Object.assign(pageContext, pageContextFromHook);
41
43
  }
42
44
  }
43
45
  return pageContext;
44
46
  }
45
- async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage) {
46
- objectAssign(pageContext, {
47
+ async function getPageContextFromServerHooks(pageContext, isErrorPage) {
48
+ const pageContextFromServerHooks = {
49
+ // TODO/eventually: move this upstream
47
50
  isHydration: false,
48
- _hasPageContextFromClient: false
49
- });
50
- let hasPageContextFromServer = false;
51
+ _hasPageContextFromServer: false
52
+ };
51
53
  // If pageContextInit has some client data or if one of the hooks guard(), data() or onBeforeRender() is server-side
52
54
  // only, then we need to fetch pageContext from the server.
53
55
  // We do it before executing any client-side hook, because it contains pageContextInit which may be needed for guard() / data() / onBeforeRender(), for example pageContextInit.user is crucial for guard()
@@ -60,13 +62,19 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
60
62
  if ('is404ServerSideRouted' in res)
61
63
  return { is404ServerSideRouted: true };
62
64
  const { pageContextFromServer } = res;
63
- hasPageContextFromServer = true;
65
+ pageContextFromServerHooks._hasPageContextFromServer = true;
64
66
  // Already handled
65
67
  assert(!(isServerSideError in pageContextFromServer));
66
68
  assert(!('serverSideError' in pageContextFromServer));
67
- objectAssign(pageContext, pageContextFromServer);
69
+ objectAssign(pageContextFromServerHooks, pageContextFromServer);
68
70
  }
69
- objectAssign(pageContext, { _hasPageContextFromServer: hasPageContextFromServer });
71
+ // We cannot return the whole pageContext because this function is used for prefetching `pageContext` (which requires a partial pageContext to be merged with the future pageContext created upon rendering the page in the future).
72
+ return { pageContextFromServerHooks };
73
+ }
74
+ async function getPageContextFromClientHooks(pageContext, isErrorPage) {
75
+ objectAssign(pageContext, {
76
+ _hasPageContextFromClient: false
77
+ });
70
78
  // At this point, we need to call the client-side guard(), data() and onBeforeRender() hooks, if they exist on client
71
79
  // env. However if we have fetched pageContext from the server, some of them might have run already on the
72
80
  // server-side, so we run only the client-only ones in this case.
@@ -76,7 +84,7 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
76
84
  if (hookName === 'guard') {
77
85
  if (!isErrorPage &&
78
86
  // 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 server-side.)
79
- !hasPageContextFromServer) {
87
+ !pageContext._hasPageContextFromServer) {
80
88
  // Should we really call the guard() hook on the client-side? Shouldn't we make the guard() hook a server-side
81
89
  // only hook? Or maybe make its env configurable like data() and onBeforeRender()?
82
90
  await executeGuardHook(pageContext, (pageContext) => preparePageContextForUserConsumptionClientSide(pageContext, true));
@@ -84,28 +92,22 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
84
92
  }
85
93
  else {
86
94
  assert(hookName === 'data' || hookName === 'onBeforeRender');
87
- if (hookClientOnlyExists(hookName, pageContext) || !hasPageContextFromServer) {
95
+ if (hookClientOnlyExists(hookName, pageContext) || !pageContext._hasPageContextFromServer) {
88
96
  // This won't do anything if no hook has been defined or if the hook's env.client is false.
89
97
  const pageContextFromHook = await executeHookClientSide(hookName, pageContext);
90
- if (pageContextFromHook)
91
- assert(!('urlOriginal' in pageContextFromHook));
98
+ assert(!('urlOriginal' in pageContextFromHook));
92
99
  Object.assign(pageContext, pageContextFromHook);
93
100
  }
94
- else {
95
- assert(hasPageContextFromServer);
96
- }
97
101
  }
98
102
  }
99
- objectAssign(pageContext, {
100
- _hasPageContextFromServer: hasPageContextFromServer
101
- });
102
- return { pageContextAugmented: pageContext };
103
+ const pageContextFromClientHooks = pageContext;
104
+ return pageContextFromClientHooks;
103
105
  }
104
106
  async function executeHookClientSide(hookName, pageContext) {
105
107
  const hook = getHook(pageContext, hookName);
106
108
  if (!hook) {
107
109
  // No hook defined or hook's env.client is false
108
- return null;
110
+ return {};
109
111
  }
110
112
  const pageContextForUserConsumption = preparePageContextForUserConsumptionClientSide(pageContext, true);
111
113
  const hookResult = await executeHook(() => hook.hookFn(pageContextForUserConsumption), hook, pageContext);
@@ -164,10 +166,16 @@ async function hasPageContextServer(pageContext) {
164
166
  async function hookServerOnlyExists(hookName, pageContext) {
165
167
  if (pageContext._pageConfigs.length > 0) {
166
168
  // V1
167
- const pageConfig = getPageConfig(pageContext._pageId, pageContext._pageConfigs);
168
- const hookEnv = getConfigValueRuntime(pageConfig, `${hookName}Env`)?.value ?? {};
169
+ const pageConfig = getPageConfig(pageContext.pageId, pageContext._pageConfigs);
170
+ const hookEnv = getConfigValueRuntime(pageConfig, `${hookName}Env`)?.value;
171
+ if (hookEnv === null)
172
+ return false;
169
173
  assert(isObject(hookEnv));
170
- return !!hookEnv.server && !hookEnv.client;
174
+ const { client, server } = hookEnv;
175
+ assert(client === true || client === undefined);
176
+ assert(server === true || server === undefined);
177
+ assert(client || server);
178
+ return !!server && !client;
171
179
  }
172
180
  else {
173
181
  // TODO/v1-release: remove
@@ -176,7 +184,7 @@ async function hookServerOnlyExists(hookName, pageContext) {
176
184
  if (hookName === 'data')
177
185
  return false;
178
186
  assert(hookName === 'onBeforeRender');
179
- const { hasOnBeforeRenderServerSideOnlyHook } = await analyzePageServerSide(pageContext._pageFilesAll, pageContext._pageId);
187
+ const { hasOnBeforeRenderServerSideOnlyHook } = await analyzePageServerSide(pageContext._pageFilesAll, pageContext.pageId);
180
188
  return hasOnBeforeRenderServerSideOnlyHook;
181
189
  }
182
190
  }
@@ -188,7 +196,7 @@ async function hookServerOnlyExists(hookName, pageContext) {
188
196
  function hookClientOnlyExists(hookName, pageContext) {
189
197
  if (pageContext._pageConfigs.length > 0) {
190
198
  // V1
191
- const pageConfig = getPageConfig(pageContext._pageId, pageContext._pageConfigs);
199
+ const pageConfig = getPageConfig(pageContext.pageId, pageContext._pageConfigs);
192
200
  const hookEnv = getConfigValueRuntime(pageConfig, `${hookName}Env`)?.value ?? {};
193
201
  assert(isObject(hookEnv));
194
202
  return !!hookEnv.client && !hookEnv.server;
@@ -223,11 +231,10 @@ async function fetchPageContextFromServer(pageContext) {
223
231
  if ('serverSideError' in pageContextFromServer || isServerSideError in pageContextFromServer) {
224
232
  throw getProjectError(`pageContext couldn't be fetched because an error occurred on the server-side`);
225
233
  }
226
- assert(hasProp(pageContextFromServer, '_pageId', 'string'));
234
+ assert(hasProp(pageContextFromServer, 'pageId', 'string'));
227
235
  processPageContextFromServer(pageContextFromServer);
228
236
  return { pageContextFromServer };
229
237
  }
230
238
  function processPageContextFromServer(pageContextFromServer) {
231
- setPageContextInitIsPassedToClient(pageContextFromServer);
232
239
  removeBuiltInOverrides(pageContextFromServer);
233
240
  }
@@ -4,7 +4,7 @@ import { assert, assertUsage, hasProp, isObject } from './utils.js';
4
4
  // - `history.state` can uninitialized (i.e. `null`):
5
5
  // - The very first render
6
6
  // - The user's code runs `location.hash = '#section'`
7
- // - The user clicks on an anchor link `<a href="#section">Section</a>` (Vike's `onLinkClick()` handler skips hash links).
7
+ // - The user clicks on an anchor link `<a href="#section">Section</a>` (Vike's `initOnLinkClick()` handler skips hash links).
8
8
  // - State information may be incomplete if `history.state` is set by an old Vike version. (E.g. `state.timestamp` was introduced for `pageContext.isBackwardNavigation` in `0.4.19`.)
9
9
  function initHistoryState() {
10
10
  // No way found to add TypeScript types to `window.history.state`: https://github.com/microsoft/TypeScript/issues/36178
@@ -0,0 +1,2 @@
1
+ export { initClientRouter };
2
+ declare function initClientRouter(): Promise<void>;
@@ -1,22 +1,25 @@
1
- export { installClientRouter };
1
+ export { initClientRouter };
2
2
  import { assert } from './utils.js';
3
3
  import { initHistoryState, monkeyPatchHistoryPushState } from './history.js';
4
4
  import { getRenderCount, renderPageClientSide } from './renderPageClientSide.js';
5
5
  import { onBrowserHistoryNavigation } from './onBrowserHistoryNavigation.js';
6
- import { onLinkClick } from './onLinkClick.js';
6
+ import { initOnLinkClick } from './initOnLinkClick.js';
7
7
  import { setupNativeScrollRestoration } from './scrollRestoration.js';
8
8
  import { autoSaveScrollPosition } from './setScrollPosition.js';
9
- async function installClientRouter() {
9
+ import { initLinkPrefetchHandlers } from './prefetch.js';
10
+ async function initClientRouter() {
10
11
  // Init navigation history and scroll restoration
11
12
  initHistoryAndScroll();
12
- // Render initial page
13
- const renderPromise = render();
13
+ // Render/hydrate
14
+ const renderFirstPagePromise = renderFirstPage();
14
15
  // Intercept <a> clicks
15
- onLinkClick();
16
+ initOnLinkClick();
17
+ // Add <a> prefetch handlers
18
+ initLinkPrefetchHandlers();
16
19
  // Preserve stack track
17
- await renderPromise;
20
+ await renderFirstPagePromise;
18
21
  }
19
- async function render() {
22
+ async function renderFirstPage() {
20
23
  assert(getRenderCount() === 0);
21
24
  await renderPageClientSide({
22
25
  scrollTarget: { preserveScroll: true },
@@ -0,0 +1,2 @@
1
+ export { initOnLinkClick };
2
+ declare function initOnLinkClick(): void;
@@ -1,9 +1,9 @@
1
1
  // Code adapted from https://github.com/HenrikJoreteg/internal-nav-helper/blob/5199ec5448d0b0db7ec63cf76d88fa6cad878b7d/src/index.js#L11-L29
2
- export { onLinkClick };
2
+ export { initOnLinkClick };
3
3
  import { assert } from './utils.js';
4
4
  import { skipLink } from './skipLink.js';
5
5
  import { renderPageClientSide } from './renderPageClientSide.js';
6
- function onLinkClick() {
6
+ function initOnLinkClick() {
7
7
  document.addEventListener('click', handler);
8
8
  }
9
9
  async function handler(ev) {
@@ -2,6 +2,7 @@ export { isClientSideRoutable };
2
2
  import { analyzePageClientSideInit } from '../../shared/getPageFiles/analyzePageClientSide.js';
3
3
  import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
4
4
  import { analyzeClientSide } from '../../shared/getPageFiles/analyzeClientSide.js';
5
+ // TODO/next-major-release: make it sync
5
6
  async function isClientSideRoutable(pageId, pageContext) {
6
7
  await analyzePageClientSideInit(pageContext._pageFilesAll, pageId, {
7
8
  sharedPageFilesAlreadyLoaded: false
@@ -27,7 +27,7 @@ function onBrowserHistoryNavigation() {
27
27
  if (isHashNavigation && !isUserLandPushStateNavigation) {
28
28
  // - `history.state` is uninitialized (`null`) when:
29
29
  // - The user's code runs `window.location.hash = '#section'`.
30
- // - The user clicks on an anchor link `<a href="#section">Section</a>` (because Vike's `onLinkClick()` handler skips hash links).
30
+ // - The user clicks on an anchor link `<a href="#section">Section</a>` (because Vike's `initOnLinkClick()` handler skips hash links).
31
31
  // - `history.state` is `null` when uninitialized: https://developer.mozilla.org/en-US/docs/Web/API/History/state
32
32
  // - Alternatively, we completely take over hash navigation and reproduce the browser's native behavior upon hash navigation.
33
33
  // - Problem: we cannot intercept `window.location.hash = '#section'`. (Or maybe we can with the `hashchange` event?)
@@ -0,0 +1,7 @@
1
+ export type { PrefetchStaticAssets };
2
+ export type { PrefetchSetting };
3
+ type PrefetchSetting = false | true | {
4
+ staticAssets?: false | 'hover' | 'viewport';
5
+ pageContext?: boolean | number;
6
+ };
7
+ type PrefetchStaticAssets = false | 'hover' | 'viewport';
@@ -1,9 +1,10 @@
1
1
  export { getPrefetchSettings };
2
- import type { PrefetchStaticAssets } from '../../../shared/types/PrefetchStaticAssets.js';
3
- type PageContextPrefetch = {
4
- exports: Record<string, unknown>;
2
+ export { PAGE_CONTEXT_MAX_AGE_DEFAULT };
3
+ export type { PrefetchSettingResolved };
4
+ import type { PageContextExports } from '../../../shared/getPageFiles.js';
5
+ declare const PAGE_CONTEXT_MAX_AGE_DEFAULT = 5000;
6
+ type PrefetchSettingResolved = {
7
+ staticAssets: false | 'hover' | 'viewport';
8
+ pageContext: false | number;
5
9
  };
6
- type PrefetchSettings = {
7
- prefetchStaticAssets: PrefetchStaticAssets;
8
- };
9
- declare function getPrefetchSettings(pageContext: PageContextPrefetch, linkTag: HTMLElement): PrefetchSettings;
10
+ declare function getPrefetchSettings(pageContext: PageContextExports, linkTag: null | HTMLElement): PrefetchSettingResolved;
@@ -1,82 +1,89 @@
1
+ // TODO/pageContext-prefetch: rename this file to getPrefetchSettingResolved.ts
1
2
  export { getPrefetchSettings };
2
- import { assert, assertUsage, assertInfo, assertWarning, isPlainObject } from '../utils.js';
3
+ export { PAGE_CONTEXT_MAX_AGE_DEFAULT };
4
+ import { assertUsage, assertInfo } from '../utils.js';
5
+ const PAGE_CONTEXT_MAX_AGE_DEFAULT = 5000;
6
+ const prefetchSettingTrue = {
7
+ staticAssets: 'hover',
8
+ pageContext: PAGE_CONTEXT_MAX_AGE_DEFAULT
9
+ };
10
+ const prefetchSettingFalse = {
11
+ staticAssets: 'hover',
12
+ pageContext: false
13
+ };
14
+ // TODO/v1-release: change to `prefetchSettingTrue`?
15
+ const prefetchSettingDefault = prefetchSettingFalse;
3
16
  function getPrefetchSettings(pageContext, linkTag) {
4
- let prefetchStaticAssets = getPrefetchStaticAssets(pageContext, linkTag);
5
- if (prefetchStaticAssets === 'viewport' && import.meta.env.DEV) {
6
- assertInfo(false, 'Viewport prefetching is disabled in development', { onlyOnce: true });
7
- prefetchStaticAssets = 'hover';
8
- }
9
- return {
10
- prefetchStaticAssets
11
- };
12
- }
13
- function getPrefetchStaticAssets(pageContext, linkTag) {
14
- {
15
- const prefetchAttribute = getPrefetchAttribute(linkTag);
16
- if (prefetchAttribute !== null)
17
- return prefetchAttribute;
18
- }
17
+ let prefetchSetting = prefetchSettingDefault;
19
18
  // TODO/v1-release: remove
20
19
  if ('prefetchLinks' in pageContext.exports) {
21
20
  assertUsage(false, '`export { prefetchLinks }` is deprecated, use `export { prefetchStaticAssets }` instead.');
22
21
  }
22
+ // TODO/v1-release: remove
23
23
  if ('prefetchStaticAssets' in pageContext.exports) {
24
- const { prefetchStaticAssets } = pageContext.exports;
25
- if (prefetchStaticAssets === false) {
26
- return false;
27
- }
28
- if (prefetchStaticAssets === 'hover') {
29
- return 'hover';
30
- }
31
- if (prefetchStaticAssets === 'viewport') {
32
- return 'viewport';
33
- }
34
- const wrongUsageMsg = "prefetchStaticAssets value should be false, 'hover', or 'viewport'";
35
- // TODO/v1-release: remove
36
- assertUsage(isPlainObject(prefetchStaticAssets), wrongUsageMsg);
37
- const keys = Object.keys(prefetchStaticAssets);
38
- assertUsage(keys.length === 1 && keys[0] === 'when', wrongUsageMsg);
39
- const { when } = prefetchStaticAssets;
40
- if (when === 'HOVER' || when === 'VIEWPORT') {
41
- const correctValue = when.toLowerCase();
42
- assertWarning(false, `prefetchStaticAssets value \`{ when: '${when}' }\` is outdated: set prefetchStaticAssets to '${correctValue}' instead`, { onlyOnce: true });
43
- return correctValue;
24
+ const prefetchStaticAssets = pageContext.exports.prefetchStaticAssets;
25
+ /* TODO/pageContext-prefetch: uncomment
26
+ const msg = `The 'prefetchStaticAssets' setting is deprecated in favor of the 'prefetch' setting, see https://vike.dev/prefetch`
27
+ assertWarning(false, msg, { onlyOnce: true })
28
+ assertUsage(
29
+ prefetchStaticAssets === false || prefetchStaticAssets === 'hover' || prefetchStaticAssets === 'viewport',
30
+ msg
31
+ )
32
+ //*/
33
+ prefetchSetting.staticAssets = prefetchStaticAssets;
34
+ }
35
+ if ('prefetch' in pageContext.exports) {
36
+ const { prefetch } = pageContext.exports;
37
+ if (prefetch === true)
38
+ prefetchSetting = prefetchSettingTrue;
39
+ if (prefetch === false)
40
+ prefetchSetting = prefetchSettingFalse;
41
+ // No validation in order to save client-side KBs
42
+ Object.assign(prefetchSetting, prefetch);
43
+ if (prefetchSetting.pageContext === true) {
44
+ prefetchSetting.pageContext = PAGE_CONTEXT_MAX_AGE_DEFAULT;
44
45
  }
45
- assertUsage(false, wrongUsageMsg);
46
46
  }
47
- return 'hover';
48
- }
49
- function getPrefetchAttribute(linkTag) {
50
- const attr = linkTag.getAttribute('data-prefetch-static-assets');
51
- const attrOld = linkTag.getAttribute('data-prefetch');
52
- if (attr === null && attrOld === null) {
53
- return null;
47
+ if (prefetchSetting.staticAssets === 'viewport' && import.meta.env.DEV) {
48
+ assertInfo(false, 'Viewport prefetching is disabled in development', { onlyOnce: true });
49
+ prefetchSetting.staticAssets = 'hover';
54
50
  }
55
- // TODO/v1-release: remove
56
- const deprecationNotice = 'The attribute data-prefetch is outdated, use data-prefetch-static-assets instead.';
57
- if (attr) {
58
- assertUsage(attrOld === null, deprecationNotice);
59
- if (attr === 'hover' || attr === 'viewport') {
60
- return attr;
51
+ if (linkTag) {
52
+ {
53
+ let attr = linkTag.getAttribute('data-prefetch');
54
+ if (attr !== null) {
55
+ if (attr === '')
56
+ attr = 'true';
57
+ if (attr === 'true')
58
+ prefetchSetting = prefetchSettingTrue;
59
+ if (attr === 'false')
60
+ prefetchSetting = prefetchSettingFalse;
61
+ }
61
62
  }
62
- if (attr === 'false') {
63
- return false;
64
- }
65
- assertUsage(false, `data-prefetch-static-assets has value "${attr}" but it should instead be "false", "hover", or "viewport"`);
66
- }
67
- // TODO/v1-release: remove
68
- if (attrOld) {
69
- assert(!attr);
70
- assertWarning(false, deprecationNotice, {
71
- onlyOnce: true
72
- });
73
- if (attrOld === 'true') {
74
- return 'viewport';
63
+ {
64
+ let attr = linkTag.getAttribute('data-prefetch-static-assets');
65
+ if (attr !== null) {
66
+ if (attr === 'false')
67
+ prefetchSetting.staticAssets = false;
68
+ // No validation in order to save client-side KBs
69
+ prefetchSetting.staticAssets = attr;
70
+ }
75
71
  }
76
- if (attrOld === 'false') {
77
- return 'hover';
72
+ {
73
+ let attr = linkTag.getAttribute('data-prefetch-page-context');
74
+ if (attr !== null) {
75
+ if (attr === '')
76
+ attr = 'true';
77
+ if (attr === 'true')
78
+ prefetchSetting.pageContext = PAGE_CONTEXT_MAX_AGE_DEFAULT;
79
+ if (attr === 'false')
80
+ prefetchSetting.pageContext = false;
81
+ const n = parseInt(attr, 10);
82
+ if (!Number.isNaN(n))
83
+ prefetchSetting.pageContext = n;
84
+ // No validation in order to save client-side KBs
85
+ }
78
86
  }
79
- assertUsage(false, `data-prefetch has value "${attrOld}" but it should instead be "true" or "false"`);
80
87
  }
81
- assert(false);
88
+ return prefetchSetting;
82
89
  }
@@ -1,5 +1,13 @@
1
1
  export { prefetch };
2
+ export { getPageContextPrefetched };
3
+ export { initLinkPrefetchHandlers };
2
4
  export { addLinkPrefetchHandlers };
5
+ export { addLinkPrefetchHandlers_watch };
6
+ export { addLinkPrefetchHandlers_unwatch };
7
+ import { type PageContextFromServerHooks } from './getPageContextFromHooks.js';
8
+ declare function getPageContextPrefetched(pageContext: {
9
+ urlOriginal: string;
10
+ }): null | PageContextFromServerHooks;
3
11
  /**
4
12
  * Programmatically prefetch client assets.
5
13
  *
@@ -7,8 +15,11 @@ export { addLinkPrefetchHandlers };
7
15
  *
8
16
  * @param url - The URL of the page you want to prefetch.
9
17
  */
10
- declare function prefetch(url: string): Promise<void>;
11
- declare function addLinkPrefetchHandlers(pageContext: {
12
- exports: Record<string, unknown>;
13
- urlPathname: string;
14
- }): void;
18
+ declare function prefetch(url: string, options?: {
19
+ pageContext?: boolean;
20
+ staticAssets?: boolean;
21
+ }): Promise<void>;
22
+ declare function addLinkPrefetchHandlers(): void;
23
+ declare function initLinkPrefetchHandlers(): void;
24
+ declare function addLinkPrefetchHandlers_watch(): void;
25
+ declare function addLinkPrefetchHandlers_unwatch(): void;