vike 0.4.245-commit-4d0629e → 0.4.245-commit-189d2b8

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.
@@ -23,8 +23,12 @@ type HistoryInfo = {
23
23
  state: StateEnhanced;
24
24
  };
25
25
  declare function onPopStateBegin(): {
26
- isHistoryStateEnhanced: boolean;
26
+ skip: true;
27
+ previous?: undefined;
28
+ current?: undefined;
29
+ } | {
27
30
  previous: HistoryInfo;
28
31
  current: HistoryInfo;
32
+ skip?: undefined;
29
33
  };
30
34
  declare function initHistory(): void;
@@ -4,7 +4,7 @@ export { onPopStateBegin };
4
4
  export { saveScrollPosition };
5
5
  export { initHistory };
6
6
  import { getCurrentUrl } from '../shared/getCurrentUrl.js';
7
- import { assert, assertUsage, getGlobalObject, isObject, deepEqual, cast } from './utils.js';
7
+ import { assert, assertUsage, getGlobalObject, isObject, deepEqual, cast, redirectHard } from './utils.js';
8
8
  const globalObject = getGlobalObject('history.ts', {
9
9
  monkeyPatched: false,
10
10
  previous: undefined,
@@ -66,6 +66,10 @@ function getTimestamp() {
66
66
  }
67
67
  function saveScrollPosition() {
68
68
  const scrollPosition = getScrollPosition();
69
+ // Don't overwrite history.state if it was set by a non-Vike history.pushState() call.
70
+ // https://github.com/vikejs/vike/issues/2801#issuecomment-3490431479
71
+ if (!isVikeEnhanced(window.history.state))
72
+ return;
69
73
  const state = getState();
70
74
  replaceHistoryState({ ...state, scrollPosition });
71
75
  }
@@ -160,13 +164,31 @@ function getHistoryInfo() {
160
164
  }
161
165
  function onPopStateBegin() {
162
166
  const { previous } = globalObject;
163
- const isHistoryStateEnhanced = window.history.state !== null;
167
+ const isHistoryStateEnhanced = isVikeEnhanced(window.history.state);
168
+ // Either:
169
+ // - `window.history.pushState(null, '', '/some-path')` , or
170
+ // - hash navigation
171
+ // - Click on `<a href="#some-hash">`
172
+ // - Using the `location` API (only hash navigation)
173
+ // See comments a the top of the ./initOnPopState.ts file.
174
+ const isHistoryStatePristine = window.history.state === null;
175
+ if (!isHistoryStateEnhanced && !isHistoryStatePristine) {
176
+ // Going to a history entry not created by Vike — entering another "SPA realm" => hard reload
177
+ // https://github.com/vikejs/vike/issues/2801#issuecomment-3490431479
178
+ redirectHard(getCurrentUrl());
179
+ return { skip: true };
180
+ }
164
181
  if (!isHistoryStateEnhanced)
165
182
  enhanceHistoryState();
166
183
  assertIsVikeEnhanced(window.history.state);
167
184
  const current = getHistoryInfo();
168
185
  globalObject.previous = current;
169
- return { isHistoryStateEnhanced, previous, current };
186
+ // Let the browser handle hash navigations.
187
+ // - Upon hash navigation: `isHistoryStatePristine===true` (see comment above).
188
+ if (isHistoryStatePristine) {
189
+ return { skip: true };
190
+ }
191
+ return { previous, current };
170
192
  }
171
193
  function initHistory() {
172
194
  monkeyPatchHistoryAPI(); // the earlier we call it the better (Vike can workaround erroneous library monkey patches if Vike is the last one in the monkey patch chain)
@@ -23,7 +23,6 @@ async function renderFirstPage() {
23
23
  assert(getRenderCount() === 0);
24
24
  await renderPageClientSide({
25
25
  scrollTarget: { preserveScroll: true },
26
- isBackwardNavigation: null,
27
26
  isClientSideNavigation: false,
28
27
  });
29
28
  }
@@ -38,7 +38,6 @@ async function onLinkClick(ev) {
38
38
  await renderPageClientSide({
39
39
  scrollTarget,
40
40
  urlOriginal: href,
41
- isBackwardNavigation: false,
42
41
  });
43
42
  }
44
43
  function isNormalLeftClick(ev) {
@@ -23,24 +23,18 @@ import { catchInfiniteLoop } from './utils.js';
23
23
  // - It isn't possible to monkey patch the `location` APIs. (Chrome throws `TypeError: Cannot redefine property` when attempt to overwrite any `location` property.)
24
24
  // - Text links aren't supported: https://github.com/vikejs/vike/issues/2114
25
25
  // - docs/ is a good playground to test all this.
26
+ // - No 'popstate' event is fired upon Server Routing — when the user clicks on a link before the page's JavaScript loaded.
27
+ // - On a pristine page without JavaScript such as https://brillout.com we have `window.history.state === null`.
26
28
  function initOnPopState() {
27
29
  window.addEventListener('popstate', onPopState);
28
30
  }
29
31
  async function onPopState() {
30
32
  catchInfiniteLoop('onPopState()');
31
- const { isHistoryStateEnhanced, previous, current } = onPopStateBegin();
32
- // - `isHistoryStateEnhanced===false` <=> new hash navigation:
33
- // - Click on `<a href="#some-hash">`
34
- // - Using the `location` API (only hash navigation, see comments above).
35
- // - `isHistoryStateEnhanced===true` <=> back-/forward navigation (including back-/forward hash navigation).
36
- // > Only back-/forward client-side navigation: no 'popstate' event is fired upon Server Routing (when the user clicks on a link before the page's JavaScript loaded), see comments above.
37
- if (!isHistoryStateEnhanced) {
38
- // Let the browser handle it
33
+ const res = onPopStateBegin();
34
+ if (res.skip)
39
35
  return;
40
- }
41
- else {
42
- await handleHistoryNavigation(previous, current);
43
- }
36
+ const { previous, current } = res;
37
+ await handleHistoryNavigation(previous, current);
44
38
  }
45
39
  async function handleHistoryNavigation(previous, current) {
46
40
  const scrollTarget = current.state.scrollPosition || undefined;
@@ -26,7 +26,6 @@ async function navigate(url, options) {
26
26
  scrollTarget,
27
27
  urlOriginal: url,
28
28
  overwriteLastHistoryEntry,
29
- isBackwardNavigation: false,
30
29
  pageContextInitClient: pageContext,
31
30
  });
32
31
  }
@@ -19,7 +19,7 @@ type PageContextRouted = {
19
19
  type PageContextBegin = Awaited<ReturnType<typeof getPageContextBegin>>;
20
20
  type RenderArgs = {
21
21
  scrollTarget: ScrollTarget;
22
- isBackwardNavigation: boolean | null;
22
+ isBackwardNavigation?: boolean | null;
23
23
  isHistoryNavigation?: true;
24
24
  urlOriginal?: string;
25
25
  overwriteLastHistoryEntry?: boolean;
@@ -36,7 +36,7 @@ const globalObject = getGlobalObject('runtime-client-routing/renderPageClientSid
36
36
  const { firstRenderStartPromise } = globalObject;
37
37
  async function renderPageClientSide(renderArgs) {
38
38
  catchInfiniteLoop('renderPageClientSide()');
39
- const { urlOriginal = getCurrentUrl(), overwriteLastHistoryEntry = false, isBackwardNavigation, isHistoryNavigation = false, pageContextsFromRewrite = [], redirectCount = 0, doNotRenderIfSamePage, isClientSideNavigation = true, pageContextInitClient, } = renderArgs;
39
+ const { urlOriginal = getCurrentUrl(), overwriteLastHistoryEntry = false, isBackwardNavigation = false, isHistoryNavigation = false, pageContextsFromRewrite = [], redirectCount = 0, doNotRenderIfSamePage, isClientSideNavigation = true, pageContextInitClient, } = renderArgs;
40
40
  let { scrollTarget } = renderArgs;
41
41
  const { previousPageContext } = globalObject;
42
42
  addLinkPrefetchHandlers_unwatch();
@@ -370,7 +370,6 @@ async function renderPageClientSide(renderArgs) {
370
370
  scrollTarget: undefined,
371
371
  urlOriginal: urlRedirect,
372
372
  overwriteLastHistoryEntry: false,
373
- isBackwardNavigation: false,
374
373
  redirectCount: redirectCount + 1,
375
374
  });
376
375
  }
@@ -664,7 +663,6 @@ if (import.meta.env.DEV && import.meta.hot)
664
663
  scrollTarget: { preserveScroll: false },
665
664
  urlOriginal: getCurrentUrl(),
666
665
  overwriteLastHistoryEntry: true,
667
- isBackwardNavigation: false,
668
666
  });
669
667
  }
670
668
  });
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.245-commit-4d0629e";
1
+ export declare const PROJECT_VERSION: "0.4.245-commit-189d2b8";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.245-commit-4d0629e';
2
+ export const PROJECT_VERSION = '0.4.245-commit-189d2b8';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.245-commit-4d0629e",
3
+ "version": "0.4.245-commit-189d2b8",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -115,7 +115,7 @@
115
115
  "dependencies": {
116
116
  "@brillout/import": "^0.2.6",
117
117
  "@brillout/json-serializer": "^0.5.21",
118
- "@brillout/picocolors": "^1.0.26",
118
+ "@brillout/picocolors": "^1.0.29",
119
119
  "@brillout/require-shim": "^0.1.2",
120
120
  "@brillout/vite-plugin-server-entry": "^0.7.15",
121
121
  "acorn": "^8.0.0",