vike 0.4.197-commit-9db6c02 → 0.4.197-commit-ab2fbbe

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.
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PROJECT_VERSION = void 0;
4
4
  // Automatically updated by @brillout/release-me
5
- exports.PROJECT_VERSION = '0.4.197-commit-9db6c02';
5
+ exports.PROJECT_VERSION = '0.4.197-commit-ab2fbbe';
@@ -19,13 +19,13 @@ type PageContextSerialized = {
19
19
  };
20
20
  declare function getPageContextFromHooks_serialized(): PageContextSerialized & {
21
21
  routeParams: Record<string, string>;
22
+ _hasPageContextFromServer: true;
22
23
  };
23
24
  declare function getPageContextFromHooks_isHydration(pageContext: PageContextSerialized & PageContext & PageContextExports & {
24
25
  _hasPageContextFromServer: true;
25
26
  }): Promise<PageContextSerialized & PageContext & PageContextExports & {
26
27
  _hasPageContextFromServer: true;
27
28
  } & {
28
- isHydration: true;
29
29
  _hasPageContextFromClient: boolean;
30
30
  }>;
31
31
  type PageContextFromServerHooks = {
@@ -32,7 +32,6 @@ function getPageContextFromHooks_serialized() {
32
32
  // TODO/eventually: rename
33
33
  async function getPageContextFromHooks_isHydration(pageContext) {
34
34
  objectAssign(pageContext, {
35
- isHydration: true,
36
35
  _hasPageContextFromClient: false
37
36
  });
38
37
  for (const hookName of ['data', 'onBeforeRender']) {
@@ -46,8 +45,6 @@ async function getPageContextFromHooks_isHydration(pageContext) {
46
45
  }
47
46
  async function getPageContextFromServerHooks(pageContext, isErrorPage) {
48
47
  const pageContextFromServerHooks = {
49
- // TODO/eventually: move this upstream
50
- isHydration: false,
51
48
  _hasPageContextFromServer: false
52
49
  };
53
50
  // If pageContextInit has some client data or if one of the hooks guard(), data() or onBeforeRender() is server-side
@@ -2,6 +2,7 @@
2
2
  export { getPrefetchSettings };
3
3
  export { PAGE_CONTEXT_MAX_AGE_DEFAULT };
4
4
  import { assertUsage, assertInfo } from '../utils.js';
5
+ // TODO/pageContext-prefetch: Make it `Infinity` for pre-rendered pages.
5
6
  const PAGE_CONTEXT_MAX_AGE_DEFAULT = 5000;
6
7
  const prefetchSettingTrue = {
7
8
  staticAssets: 'hover',
@@ -1,13 +1,26 @@
1
1
  export { prefetch };
2
2
  export { getPageContextPrefetched };
3
3
  export { initLinkPrefetchHandlers };
4
+ export { populatePageContextPrefetchCache };
4
5
  export { addLinkPrefetchHandlers };
5
6
  export { addLinkPrefetchHandlers_watch };
6
7
  export { addLinkPrefetchHandlers_unwatch };
7
- import { type PageContextFromServerHooks } from './getPageContextFromHooks.js';
8
- declare function getPageContextPrefetched(pageContext: {
8
+ import { type PageContextFromServerHooks, getPageContextFromServerHooks } from './getPageContextFromHooks.js';
9
+ import { PageFile } from '../../shared/getPageFiles.js';
10
+ import { type PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
11
+ type ResultPageContextFromServer = Awaited<ReturnType<typeof getPageContextFromServerHooks>>;
12
+ type PageContextForPrefetch = {
9
13
  urlOriginal: string;
14
+ urlPathname: string;
15
+ pageId: string;
16
+ _urlRewrite: null;
17
+ _pageFilesAll: PageFile[];
18
+ _pageConfigs: PageConfigRuntime[];
19
+ };
20
+ declare function getPageContextPrefetched(pageContext: {
21
+ urlPathname: string;
10
22
  }): null | PageContextFromServerHooks;
23
+ declare function populatePageContextPrefetchCache(pageContext: PageContextForPrefetch, result: ResultPageContextFromServer): void;
11
24
  /**
12
25
  * Programmatically prefetch client assets.
13
26
  *
@@ -1,6 +1,7 @@
1
1
  export { prefetch };
2
2
  export { getPageContextPrefetched };
3
3
  export { initLinkPrefetchHandlers };
4
+ export { populatePageContextPrefetchCache };
4
5
  export { addLinkPrefetchHandlers };
5
6
  export { addLinkPrefetchHandlers_watch };
6
7
  export { addLinkPrefetchHandlers_unwatch };
@@ -26,13 +27,15 @@ const globalObject = getGlobalObject('prefetch.ts', {
26
27
  prefetchedPageContexts: {}
27
28
  });
28
29
  function getPageContextPrefetched(pageContext) {
29
- const url = pageContext.urlOriginal;
30
- const found = globalObject.prefetchedPageContexts[url];
30
+ const key = getCacheKey(pageContext.urlPathname);
31
+ const found = globalObject.prefetchedPageContexts[key];
31
32
  if (!found || found.result.is404ServerSideRouted || isExpired(found))
32
33
  return null;
33
34
  const pageContextPrefetched = found.result.pageContextFromServerHooks;
35
+ /* TODO/pageContext-prefetch: make it work for when resultMaxAge is Infinity.
34
36
  // We discard the prefetched pageContext whenever we use it, so that the user always sees fresh data upon naivgating.
35
- delete globalObject.prefetchedPageContexts[url];
37
+ delete globalObject.prefetchedPageContexts[key]
38
+ */
36
39
  return pageContextPrefetched;
37
40
  }
38
41
  async function prefetchAssets(pageContextLink) {
@@ -50,13 +53,30 @@ async function prefetchAssets(pageContextLink) {
50
53
  }
51
54
  async function prefetchPageContextFromServerHooks(pageContextLink, resultMaxAge) {
52
55
  const result = await getPageContextFromServerHooks(pageContextLink, false);
53
- const urlOfLink = pageContextLink.urlOriginal;
54
- globalObject.prefetchedPageContexts[urlOfLink] = {
56
+ setPageContextPrefetchCache(pageContextLink, result, resultMaxAge);
57
+ }
58
+ function populatePageContextPrefetchCache(pageContext, result) {
59
+ setPageContextPrefetchCache(pageContext, result, null);
60
+ }
61
+ function setPageContextPrefetchCache(pageContext, result, resultMaxAge) {
62
+ if (resultMaxAge === null)
63
+ resultMaxAge = getResultMaxAge();
64
+ const key = getCacheKey(pageContext.urlPathname);
65
+ globalObject.prefetchedPageContexts[key] = {
55
66
  resultFetchedAt: Date.now(),
56
67
  resultMaxAge,
57
68
  result
58
69
  };
59
70
  }
71
+ function getResultMaxAge() {
72
+ const pageContextCurrent = getPageContextCurrent();
73
+ // TODO/pageContext-prefetch: remove this dirty hack used by @brillout/docpress and, instead, use Vike's default if pageContextCurrent isn't defined yet.
74
+ if (!pageContextCurrent)
75
+ return Infinity;
76
+ const prefetchSettings = getPrefetchSettings(pageContextCurrent, null);
77
+ const resultMaxAge = typeof prefetchSettings.pageContext === 'number' ? prefetchSettings.pageContext : PAGE_CONTEXT_MAX_AGE_DEFAULT;
78
+ return resultMaxAge;
79
+ }
60
80
  /**
61
81
  * Programmatically prefetch client assets.
62
82
  *
@@ -87,27 +107,11 @@ async function prefetch(url, options) {
87
107
  })(),
88
108
  (async () => {
89
109
  if (options?.pageContext !== false) {
90
- const resultMaxAge = getResultMaxAge();
110
+ const resultMaxAge = typeof options?.pageContext === 'number' ? options.pageContext : null;
91
111
  await prefetchPageContextFromServerHooks(pageContextLink, resultMaxAge);
92
112
  }
93
113
  })()
94
114
  ]);
95
- return;
96
- function getResultMaxAge() {
97
- if (typeof options?.pageContext === 'number') {
98
- return options.pageContext;
99
- }
100
- else {
101
- // If user calls prefetch() before hydration finished => await the pageContext to be set
102
- const pageContextCurrent = getPageContextCurrent();
103
- // TODO/pageContext-prefetch: remove this dirty hack for @brillout/docpress and, instead, use Vike's default if pageContextCurrent isn't defined yet.
104
- if (!pageContextCurrent)
105
- return Infinity;
106
- const prefetchSettings = getPrefetchSettings(pageContextCurrent, null);
107
- const resultMaxAge = typeof prefetchSettings.pageContext === 'number' ? prefetchSettings.pageContext : PAGE_CONTEXT_MAX_AGE_DEFAULT;
108
- return resultMaxAge;
109
- }
110
- }
111
115
  }
112
116
  // Lazy execution logic copied from: https://github.com/withastro/astro/blob/2594eb088d53a98181ac820243bcb1a765856ecf/packages/astro/src/runtime/client/dev-toolbar/apps/audit/index.ts#L53-L72
113
117
  function addLinkPrefetchHandlers() {
@@ -147,7 +151,7 @@ function addLinkPrefetchHandlers_apply() {
147
151
  continue;
148
152
  globalObject.linkPrefetchHandlerAdded.add(linkTag);
149
153
  if (skipLink(linkTag))
150
- return;
154
+ continue;
151
155
  linkTag.addEventListener('mouseover', () => {
152
156
  prefetchOnEvent(linkTag, 'hover');
153
157
  }, { passive: true });
@@ -172,7 +176,7 @@ async function prefetchOnEvent(linkTag, event) {
172
176
  prefetchSettings = getPrefetchSettings(pageContextCurrent, linkTag);
173
177
  }
174
178
  else {
175
- // TODO/pageContext-prefetch: remove this dirty hack for @brillout/docpress and, instead, use Vike's default if pageContextCurrent isn't defined yet.
179
+ // TODO/pageContext-prefetch: remove this dirty hack used by @brillout/docpress and, instead, use Vike's default if pageContextCurrent isn't defined yet.
176
180
  prefetchSettings = { staticAssets: 'hover', pageContext: Infinity };
177
181
  }
178
182
  const urlOfLink = linkTag.getAttribute('href');
@@ -191,7 +195,8 @@ async function prefetchOnEvent(linkTag, event) {
191
195
  })(),
192
196
  (async () => {
193
197
  if (event !== 'viewport' && prefetchSettings.pageContext) {
194
- const found = globalObject.prefetchedPageContexts[urlOfLink];
198
+ const key = getCacheKey(urlOfLink);
199
+ const found = globalObject.prefetchedPageContexts[key];
195
200
  if (!found || isExpired(found)) {
196
201
  // TODO/pageContext-prefetch: move this logic in getPrefetchSettings()
197
202
  const resultMaxAge = prefetchSettings.pageContext;
@@ -218,3 +223,10 @@ async function getPageContextLink(urlOfLink) {
218
223
  objectAssign(pageContextLink, pageContextFromRoute);
219
224
  return pageContextLink;
220
225
  }
226
+ function getCacheKey(url) {
227
+ if (url.startsWith('#'))
228
+ url = '/';
229
+ assert(url.startsWith('/'), { urlPathname: url });
230
+ const key = url.split('#')[0];
231
+ return key;
232
+ }
@@ -5,7 +5,7 @@ export { firstRenderStartPromise };
5
5
  import { assert, getCurrentUrl, isSameErrorMessage, objectAssign, redirectHard, getGlobalObject, executeHook, hasProp, augmentType, genPromise, isCallable } from './utils.js';
6
6
  import { getPageContextFromClientHooks, getPageContextFromServerHooks, getPageContextFromHooks_isHydration, getPageContextFromHooks_serialized, setPageContextInitIsPassedToClient } from './getPageContextFromHooks.js';
7
7
  import { createPageContext } from './createPageContext.js';
8
- import { addLinkPrefetchHandlers, addLinkPrefetchHandlers_unwatch, addLinkPrefetchHandlers_watch, getPageContextPrefetched } from './prefetch.js';
8
+ import { addLinkPrefetchHandlers, addLinkPrefetchHandlers_unwatch, addLinkPrefetchHandlers_watch, getPageContextPrefetched, populatePageContextPrefetchCache } from './prefetch.js';
9
9
  import { assertInfo, assertWarning, isReact } from './utils.js';
10
10
  import { executeOnRenderClientHook } from '../shared/executeOnRenderClientHook.js';
11
11
  import { assertHook, getHook } from '../../shared/hooks/getHook.js';
@@ -56,6 +56,7 @@ async function renderPageClientSide(renderArgs) {
56
56
  const pageContext = await getPageContextBegin();
57
57
  if (isRenderOutdated())
58
58
  return;
59
+ objectAssign(pageContext, { isHydration: isFirstRender });
59
60
  // onPageTransitionStart()
60
61
  if (globalObject.isFirstRenderDone) {
61
62
  assert(previousPageContext);
@@ -81,10 +82,13 @@ async function renderPageClientSide(renderArgs) {
81
82
  }
82
83
  }
83
84
  // Route
84
- let pageContextRouted;
85
85
  if (isFirstRender) {
86
86
  const pageContextSerialized = getPageContextFromHooks_serialized();
87
- pageContextRouted = pageContextSerialized;
87
+ // TODO/eventually: create helper assertPageContextFromHook()
88
+ assert(!('urlOriginal' in pageContextSerialized));
89
+ objectAssign(pageContext, pageContextSerialized);
90
+ // TODO/pageContext-prefetch: remove or change, because this only makes sense for a pre-rendered page
91
+ populatePageContextPrefetchCache(pageContext, { pageContextFromServerHooks: pageContextSerialized });
88
92
  }
89
93
  else {
90
94
  let pageContextFromRoute;
@@ -125,10 +129,10 @@ async function renderPageClientSide(renderArgs) {
125
129
  // Skip's Vike's rendering; let the user handle the navigation
126
130
  return;
127
131
  }
128
- pageContextRouted = pageContextFromRoute;
132
+ // TODO/eventually: create helper assertPageContextFromHook()
133
+ assert(!('urlOriginal' in pageContextFromRoute));
134
+ objectAssign(pageContext, pageContextFromRoute);
129
135
  }
130
- assert(!('urlOriginal' in pageContextRouted));
131
- objectAssign(pageContext, pageContextRouted);
132
136
  try {
133
137
  objectAssign(pageContext, await loadUserFilesClientSide(pageContext.pageId, pageContext._pageFilesAll, pageContext._pageConfigs));
134
138
  }
@@ -144,6 +148,7 @@ async function renderPageClientSide(renderArgs) {
144
148
  }
145
149
  if (isRenderOutdated())
146
150
  return;
151
+ setPageContextCurrent(pageContext);
147
152
  // Set global hydrationCanBeAborted
148
153
  if (pageContext.exports.hydrationCanBeAborted) {
149
154
  setHydrationCanBeAborted();
@@ -184,6 +189,8 @@ async function renderPageClientSide(renderArgs) {
184
189
  if (result.is404ServerSideRouted)
185
190
  return;
186
191
  pageContextFromServerHooks = result.pageContextFromServerHooks;
192
+ // TODO/pageContext-prefetch: remove or change, because this only makes sense for a pre-rendered page
193
+ populatePageContextPrefetchCache(pageContext, result);
187
194
  }
188
195
  catch (err) {
189
196
  await onError(err);
@@ -333,6 +340,7 @@ async function renderPageClientSide(renderArgs) {
333
340
  }
334
341
  if (isRenderOutdated())
335
342
  return;
343
+ setPageContextCurrent(pageContext);
336
344
  let pageContextFromServerHooks;
337
345
  try {
338
346
  const result = await getPageContextFromServerHooks(pageContext, true);
@@ -407,7 +415,6 @@ async function renderPageClientSide(renderArgs) {
407
415
  /* We don't abort in order to ensure that onHydrationEnd() is called: we abort only after onHydrationEnd() is called.
408
416
  if (isRenderOutdated(true)) return
409
417
  */
410
- setPageContextCurrent(pageContext);
411
418
  // onHydrationEnd()
412
419
  if (isFirstRender && !onRenderClientError) {
413
420
  assertHook(pageContext, 'onHydrationEnd');
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.197-commit-9db6c02";
1
+ export declare const PROJECT_VERSION: "0.4.197-commit-ab2fbbe";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.197-commit-9db6c02';
2
+ export const PROJECT_VERSION = '0.4.197-commit-ab2fbbe';
@@ -1,4 +1,4 @@
1
1
  export declare const projectInfo: {
2
2
  projectName: "Vike";
3
- projectVersion: "0.4.197-commit-9db6c02";
3
+ projectVersion: "0.4.197-commit-ab2fbbe";
4
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.197-commit-9db6c02",
3
+ "version": "0.4.197-commit-ab2fbbe",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {