vike 0.4.144-commit-f7ab002 → 0.4.144-commit-de18325

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 (79) hide show
  1. package/dist/cjs/__internal/index.js +6 -2
  2. package/dist/cjs/node/plugin/plugins/commonConfig.js +0 -3
  3. package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -0
  4. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +58 -40
  5. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +1 -0
  6. package/dist/cjs/node/plugin/plugins/previewConfig.js +5 -0
  7. package/dist/cjs/node/prerender/runPrerender.js +10 -11
  8. package/dist/cjs/node/prerender/utils.js +1 -1
  9. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +1 -0
  10. package/dist/cjs/node/runtime/renderPage/debugPageFiles.js +5 -5
  11. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +1 -1
  12. package/dist/cjs/node/runtime/renderPage.js +3 -3
  13. package/dist/cjs/node/runtime/utils.js +1 -1
  14. package/dist/cjs/shared/addUrlComputedProps.js +24 -12
  15. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +41 -15
  16. package/dist/cjs/shared/route/index.js +22 -32
  17. package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
  18. package/dist/cjs/shared/utils.js +1 -1
  19. package/dist/cjs/utils/{hasPropertyGetter.js → isPropertyGetter.js} +3 -3
  20. package/dist/cjs/utils/projectInfo.js +1 -1
  21. package/dist/esm/__internal/index.d.ts +6 -3
  22. package/dist/esm/__internal/index.js +8 -3
  23. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +2 -3
  24. package/dist/esm/client/client-routing-runtime/createPageContext.js +3 -3
  25. package/dist/esm/client/client-routing-runtime/entry.js +2 -2
  26. package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +0 -1
  27. package/dist/esm/client/client-routing-runtime/getPageContext.js +6 -9
  28. package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
  29. package/dist/esm/client/client-routing-runtime/history.js +26 -8
  30. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +21 -0
  31. package/dist/esm/client/client-routing-runtime/{useClientRouter.js → installClientRouter.js} +248 -242
  32. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.d.ts +8 -0
  33. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +15 -0
  34. package/dist/esm/client/client-routing-runtime/navigate.d.ts +0 -2
  35. package/dist/esm/client/client-routing-runtime/navigate.js +10 -8
  36. package/dist/esm/client/client-routing-runtime/prefetch.js +54 -28
  37. package/dist/esm/client/client-routing-runtime/skipLink.d.ts +0 -1
  38. package/dist/esm/client/client-routing-runtime/skipLink.js +1 -2
  39. package/dist/esm/client/server-routing-runtime/getPageContext.js +1 -1
  40. package/dist/esm/client/shared/executeOnRenderClientHook.js +6 -5
  41. package/dist/esm/client/shared/getPageContextProxyForUser.js +13 -7
  42. package/dist/esm/client/shared/loadPageFilesClientSide.d.ts +8 -3
  43. package/dist/esm/client/shared/loadPageFilesClientSide.js +5 -5
  44. package/dist/esm/node/plugin/plugins/commonConfig.js +0 -3
  45. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -0
  46. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +58 -40
  47. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +1 -0
  48. package/dist/esm/node/plugin/plugins/previewConfig.js +5 -0
  49. package/dist/esm/node/prerender/runPrerender.js +11 -12
  50. package/dist/esm/node/prerender/utils.d.ts +1 -1
  51. package/dist/esm/node/prerender/utils.js +1 -1
  52. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +1 -0
  53. package/dist/esm/node/runtime/renderPage/debugPageFiles.d.ts +5 -5
  54. package/dist/esm/node/runtime/renderPage/debugPageFiles.js +5 -5
  55. package/dist/esm/node/runtime/renderPage/loadPageFilesServerSide.d.ts +2 -2
  56. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +1 -1
  57. package/dist/esm/node/runtime/renderPage.js +3 -3
  58. package/dist/esm/node/runtime/utils.d.ts +1 -1
  59. package/dist/esm/node/runtime/utils.js +1 -1
  60. package/dist/esm/shared/addUrlComputedProps.d.ts +1 -0
  61. package/dist/esm/shared/addUrlComputedProps.js +25 -13
  62. package/dist/esm/shared/route/executeOnBeforeRouteHook.d.ts +5 -8
  63. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +41 -15
  64. package/dist/esm/shared/route/index.d.ts +12 -10
  65. package/dist/esm/shared/route/index.js +23 -33
  66. package/dist/esm/shared/route/resolveRouteFunction.js +1 -1
  67. package/dist/esm/shared/utils.d.ts +1 -1
  68. package/dist/esm/shared/utils.js +1 -1
  69. package/dist/esm/utils/isPropertyGetter.d.ts +1 -0
  70. package/dist/esm/utils/{hasPropertyGetter.js → isPropertyGetter.js} +1 -1
  71. package/dist/esm/utils/projectInfo.d.ts +1 -1
  72. package/dist/esm/utils/projectInfo.js +1 -1
  73. package/package.json +1 -1
  74. package/dist/esm/client/client-routing-runtime/getPageId.d.ts +0 -10
  75. package/dist/esm/client/client-routing-runtime/getPageId.js +0 -17
  76. package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.d.ts +0 -2
  77. package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.js +0 -15
  78. package/dist/esm/client/client-routing-runtime/useClientRouter.d.ts +0 -6
  79. package/dist/esm/utils/hasPropertyGetter.d.ts +0 -1
@@ -18,35 +18,25 @@ const resolveRouteFunction_js_1 = require("./resolveRouteFunction.js");
18
18
  const executeOnBeforeRouteHook_js_1 = require("./executeOnBeforeRouteHook.js");
19
19
  const debug_js_1 = require("./debug.js");
20
20
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
21
- async function route(pageContext) {
22
- (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContext);
23
- (0, debug_js_1.debug)('Pages routes:', pageContext._pageRoutes);
24
- const pageContextAddendum = {};
25
- if (pageContext._onBeforeRouteHook) {
26
- const pageContextAddendumHook = await (0, executeOnBeforeRouteHook_js_1.executeOnBeforeRouteHook)(pageContext._onBeforeRouteHook, pageContext);
27
- if (pageContextAddendumHook) {
28
- (0, utils_js_1.objectAssign)(pageContextAddendum, pageContextAddendumHook);
29
- if ((0, utils_js_1.hasProp)(pageContextAddendum, '_pageId', 'string') || (0, utils_js_1.hasProp)(pageContextAddendum, '_pageId', 'null')) {
30
- // We bypass Vike's routing
31
- if (!(0, utils_js_1.hasProp)(pageContextAddendum, 'routeParams')) {
32
- (0, utils_js_1.objectAssign)(pageContextAddendum, { routeParams: {} });
33
- }
34
- else {
35
- (0, utils_js_1.assert)((0, utils_js_1.hasProp)(pageContextAddendum, 'routeParams', 'object'));
36
- }
37
- (0, utils_js_1.objectAssign)(pageContextAddendum, {
38
- _routingProvidedByOnBeforeRouteHook: true,
39
- _routeMatches: 'CUSTOM_ROUTE'
40
- });
41
- return { pageContextAddendum };
42
- }
43
- // We already assign so that `pageContext.urlOriginal === pageContextAddendum.urlOriginal`; enabling the `onBeforeRoute()` hook to mutate `pageContext.urlOriginal` before routing.
44
- (0, utils_js_1.objectAssign)(pageContext, pageContextAddendum);
21
+ async function route(pageContextForRoute) {
22
+ (0, debug_js_1.debug)('Pages routes:', pageContextForRoute._pageRoutes);
23
+ (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContextForRoute);
24
+ const pageContextFromRoute = {};
25
+ // onBeforeRoute()
26
+ const pageContextFromOnBeforeRouteHook = await (0, executeOnBeforeRouteHook_js_1.executeOnBeforeRouteHook)(pageContextForRoute);
27
+ if (pageContextFromOnBeforeRouteHook) {
28
+ if (pageContextFromOnBeforeRouteHook._routingProvidedByOnBeforeRouteHook) {
29
+ (0, utils_js_1.assert)(pageContextFromOnBeforeRouteHook._pageId);
30
+ return pageContextFromOnBeforeRouteHook;
31
+ }
32
+ else {
33
+ (0, utils_js_1.objectAssign)(pageContextFromRoute, pageContextFromOnBeforeRouteHook);
45
34
  }
46
35
  }
47
- (0, utils_js_1.objectAssign)(pageContextAddendum, {
48
- _routingProvidedByOnBeforeRouteHook: false
49
- });
36
+ // We take into account pageContext.urlLogical set by onBeforeRoute()
37
+ const pageContext = {};
38
+ (0, utils_js_1.objectAssign)(pageContext, pageContextForRoute);
39
+ (0, utils_js_1.objectAssign)(pageContext, pageContextFromOnBeforeRouteHook);
50
40
  // Vike's routing
51
41
  const allPageIds = pageContext._allPageIds;
52
42
  (0, utils_js_1.assert)(allPageIds.length >= 0);
@@ -98,22 +88,22 @@ async function route(pageContext) {
98
88
  (0, resolvePrecedence_js_1.resolvePrecendence)(routeMatches);
99
89
  const winner = routeMatches[0];
100
90
  (0, debug_js_1.debug)(`Route matches for URL ${picocolors_1.default.cyan(urlPathname)} (in precedence order):`, routeMatches);
101
- (0, utils_js_1.objectAssign)(pageContextAddendum, { _routeMatches: routeMatches });
91
+ (0, utils_js_1.objectAssign)(pageContextFromRoute, { _debugRouteMatches: routeMatches });
102
92
  if (!winner) {
103
- (0, utils_js_1.objectAssign)(pageContextAddendum, {
93
+ (0, utils_js_1.objectAssign)(pageContextFromRoute, {
104
94
  _pageId: null,
105
95
  routeParams: {}
106
96
  });
107
- return { pageContextAddendum };
97
+ return pageContextFromRoute;
108
98
  }
109
99
  {
110
100
  const { routeParams } = winner;
111
101
  (0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(routeParams));
112
- (0, utils_js_1.objectAssign)(pageContextAddendum, {
102
+ (0, utils_js_1.objectAssign)(pageContextFromRoute, {
113
103
  _pageId: winner.pageId,
114
104
  routeParams: winner.routeParams
115
105
  });
116
106
  }
117
- return { pageContextAddendum };
107
+ return pageContextFromRoute;
118
108
  }
119
109
  exports.route = route;
@@ -11,7 +11,7 @@ async function resolveRouteFunction(routeFunction, pageContext, routeDefinedAt)
11
11
  (0, addUrlComputedProps_js_1.assertPageContextUrlComputedProps)(pageContext);
12
12
  let result = routeFunction(pageContext);
13
13
  assertSyncRouting(result, `The Route Function ${routeDefinedAt}`);
14
- // TODO/v1-release
14
+ // TODO/v1-release: make resolveRouteFunction() and route() sync
15
15
  //* We disallow asynchronous routing, because we need to check whether a link is a Vike link in a synchronous fashion before calling ev.preventDefault() in the 'click' event listener
16
16
  result = await result;
17
17
  //*/
@@ -35,7 +35,7 @@ __exportStar(require("../utils/stringifyStringArray.js"), exports);
35
35
  __exportStar(require("../utils/filesystemPathHandling.js"), exports);
36
36
  __exportStar(require("../utils/cast.js"), exports);
37
37
  __exportStar(require("../utils/projectInfo.js"), exports);
38
- __exportStar(require("../utils/hasPropertyGetter.js"), exports);
38
+ __exportStar(require("../utils/isPropertyGetter.js"), exports);
39
39
  __exportStar(require("../utils/isPromise.js"), exports);
40
40
  __exportStar(require("../utils/checkType.js"), exports);
41
41
  __exportStar(require("../utils/objectEntries.js"), exports);
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasPropertyGetter = void 0;
4
- function hasPropertyGetter(obj, prop) {
3
+ exports.isPropertyGetter = void 0;
4
+ function isPropertyGetter(obj, prop) {
5
5
  const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
6
6
  return !!descriptor && !('value' in descriptor) && !!descriptor.get;
7
7
  }
8
- exports.hasPropertyGetter = hasPropertyGetter;
8
+ exports.isPropertyGetter = isPropertyGetter;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.projectInfo = void 0;
4
4
  const assertSingleInstance_js_1 = require("./assertSingleInstance.js");
5
- const PROJECT_VERSION = '0.4.144-commit-f7ab002';
5
+ const PROJECT_VERSION = '0.4.144-commit-de18325';
6
6
  const projectInfo = {
7
7
  projectName: 'Vike',
8
8
  projectVersion: PROJECT_VERSION,
@@ -1,8 +1,8 @@
1
- import { route, type PageRoutes } from '../shared/route/index.js';
2
- import { type PageFile } from '../shared/getPageFiles.js';
3
- import { PageConfigRuntime } from '../shared/page-configs/PageConfig.js';
4
1
  export { route, getPagesAndRoutes };
5
2
  export type { PageRoutes, PageFile, PageConfigRuntime as PageConfig };
3
+ import { route as routeInternal, type PageRoutes } from '../shared/route/index.js';
4
+ import { type PageFile } from '../shared/getPageFiles.js';
5
+ import { PageConfigRuntime } from '../shared/page-configs/PageConfig.js';
6
6
  /**
7
7
  * Used by {@link https://github.com/magne4000/vite-plugin-vercel|vite-plugin-vercel}
8
8
  * to compute some rewrite rules and extract { isr } configs.
@@ -15,3 +15,6 @@ declare function getPagesAndRoutes(): Promise<{
15
15
  pageConfigs: PageConfigRuntime[];
16
16
  allPageIds: string[];
17
17
  }>;
18
+ declare function route(pageContext: Parameters<typeof routeInternal>[0]): Promise<{
19
+ pageContextAddendum: import("../shared/route/index.js").PageContextFromRoute;
20
+ }>;
@@ -1,10 +1,10 @@
1
- // Internal functions of vike needed by other plugins are exported via this file
2
- import { route } from '../shared/route/index.js';
1
+ // Internals needed by vite-plugin-vercel
2
+ export { route, getPagesAndRoutes };
3
+ import { route as routeInternal } from '../shared/route/index.js';
3
4
  import { getGlobalContext, initGlobalContext } from '../node/runtime/globalContext.js';
4
5
  import { setNodeEnvToProduction } from '../utils/nodeEnv.js';
5
6
  import { assert } from '../utils/assert.js';
6
7
  import { getRenderContext } from '../node/runtime/renderPage/renderPageAlreadyRouted.js';
7
- export { route, getPagesAndRoutes };
8
8
  /**
9
9
  * Used by {@link https://github.com/magne4000/vite-plugin-vercel|vite-plugin-vercel}
10
10
  * to compute some rewrite rules and extract { isr } configs.
@@ -25,3 +25,8 @@ async function getPagesAndRoutes() {
25
25
  allPageIds
26
26
  };
27
27
  }
28
+ async function route(pageContext) {
29
+ const pageContextFromRoute = await routeInternal(pageContext);
30
+ // Old interface
31
+ return { pageContextAddendum: pageContextFromRoute };
32
+ }
@@ -1,7 +1,6 @@
1
1
  export { createPageContext };
2
- declare function createPageContext<T extends {
2
+ declare function createPageContext(urlOriginal: string): Promise<{
3
3
  urlOriginal: string;
4
- }>(pageContextBase?: T): Promise<{
5
4
  _objectCreatedByVike: boolean;
6
5
  _urlHandler: null;
7
6
  _urlRewrite: null;
@@ -13,6 +12,6 @@ declare function createPageContext<T extends {
13
12
  _allPageIds: string[];
14
13
  _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
15
14
  _onBeforeRouteHook: import("../../shared/route/executeOnBeforeRouteHook.js").OnBeforeRouteHook | null;
16
- } & T & import("../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
15
+ } & import("../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
17
16
  _urlRewrite: string | null;
18
17
  }>;
@@ -3,9 +3,9 @@ import { addUrlComputedProps } from '../../shared/addUrlComputedProps.js';
3
3
  import { getPageFilesAll } from '../../shared/getPageFiles.js';
4
4
  import { loadPageRoutes } from '../../shared/route/loadPageRoutes.js';
5
5
  import { getBaseServer } from './getBaseServer.js';
6
- import { assert, isBaseServer, objectAssign, getGlobalObject } from './utils.js';
6
+ import { assert, isBaseServer, getGlobalObject } from './utils.js';
7
7
  const globalObject = getGlobalObject('createPageContext.ts', {});
8
- async function createPageContext(pageContextBase) {
8
+ async function createPageContext(urlOriginal) {
9
9
  if (!globalObject.pageFilesData) {
10
10
  globalObject.pageFilesData = await getPageFilesAll(true);
11
11
  }
@@ -16,6 +16,7 @@ async function createPageContext(pageContextBase) {
16
16
  // @ts-ignore Since dist/cjs/client/ is never used, we can ignore this error.
17
17
  const isProd = import.meta.env.PROD;
18
18
  const pageContext = {
19
+ urlOriginal,
19
20
  _objectCreatedByVike: true,
20
21
  _urlHandler: null,
21
22
  _urlRewrite: null,
@@ -29,7 +30,6 @@ async function createPageContext(pageContextBase) {
29
30
  _pageRoutes: pageRoutes,
30
31
  _onBeforeRouteHook: onBeforeRouteHook
31
32
  };
32
- objectAssign(pageContext, pageContextBase);
33
33
  addUrlComputedProps(pageContext);
34
34
  return pageContext;
35
35
  }
@@ -1,9 +1,9 @@
1
1
  import { assertClientRouting } from '../../utils/assertRoutingType.js';
2
2
  assertClientRouting();
3
3
  import './pageFiles';
4
- import { useClientRouter } from './useClientRouter.js';
4
+ import { installClientRouter } from './installClientRouter.js';
5
5
  import { onClientEntry_ClientRouting } from './utils.js';
6
6
  // @ts-ignore Since dist/cjs/client/ is never used, we can ignore this error.
7
7
  const isProd = import.meta.env.PROD;
8
8
  onClientEntry_ClientRouting(isProd);
9
- useClientRouter();
9
+ installClientRouter();
@@ -21,7 +21,6 @@ declare function getPageContext(pageContext: {
21
21
  declare function getPageContextErrorPage(pageContext: {
22
22
  urlOriginal: string;
23
23
  _allPageIds: string[];
24
- _isFirstRenderAttempt: boolean;
25
24
  _pageFilesAll: PageFile[];
26
25
  _pageConfigs: PageConfigRuntime[];
27
26
  } & PageContextPassThrough): Promise<PageContextAddendum>;
@@ -21,13 +21,11 @@ import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
21
21
  const globalObject = getGlobalObject('router/getPageContext.ts', {});
22
22
  async function getPageContext(pageContext) {
23
23
  if (pageContext._isFirstRenderAttempt && navigationState.isFirstUrl(pageContext.urlOriginal)) {
24
- assert(hasProp(pageContext, '_isFirstRenderAttempt', 'true'));
25
24
  const pageContextAddendum = await getPageContextFirstRender(pageContext);
26
25
  setPageContextInitHasClientData(pageContextAddendum);
27
26
  return pageContextAddendum;
28
27
  }
29
28
  else {
30
- assert(hasProp(pageContext, '_isFirstRenderAttempt', 'false'));
31
29
  const pageContextAddendum = await getPageContextUponNavigation(pageContext);
32
30
  setPageContextInitHasClientData(pageContextAddendum);
33
31
  return pageContextAddendum;
@@ -40,7 +38,7 @@ async function getPageContextFirstRender(pageContext) {
40
38
  isHydration: true,
41
39
  _hasPageContextFromClient: false
42
40
  });
43
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContext._pageFilesAll, pageContext._pageConfigs, pageContextAddendum._pageId));
41
+ objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContextAddendum._pageId, pageContext));
44
42
  {
45
43
  const pageContextForHook = { ...pageContext, ...pageContextAddendum };
46
44
  if (await onBeforeRenderClientOnlyExists(pageContextForHook)) {
@@ -71,7 +69,7 @@ async function getPageContextUponNavigation(pageContext) {
71
69
  }
72
70
  async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
73
71
  let pageContextAddendum = {};
74
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContext._pageFilesAll, pageContext._pageConfigs, pageContext._pageId));
72
+ objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContext._pageId, pageContext));
75
73
  // Needs to be called before any client-side hook, because it may contain pageContextInit.user which is needed for guard() and onBeforeRender()
76
74
  if (
77
75
  // For the error page, we cannot fetch pageContext from the server because the pageContext JSON request is based on the URL
@@ -89,7 +87,7 @@ async function getPageContextAlreadyRouted(pageContext, isErrorPage) {
89
87
  isHydration: false,
90
88
  _pageId: errorPageId
91
89
  });
92
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContext._pageFilesAll, pageContext._pageConfigs, pageContextAddendum._pageId));
90
+ objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageContextAddendum._pageId, pageContext));
93
91
  assert(hasProp(pageContextFromServer, 'is404', 'boolean'));
94
92
  assert(hasProp(pageContextFromServer, 'pageProps', 'object'));
95
93
  assert(hasProp(pageContextFromServer.pageProps, 'is404', 'boolean'));
@@ -185,8 +183,8 @@ async function onBeforeRenderClientOnlyExists(pageContext) {
185
183
  }
186
184
  }
187
185
  async function getPageContextFromRoute(pageContext) {
188
- const routeResult = await route(pageContext);
189
- const pageContextFromRoute = routeResult.pageContextAddendum;
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))
190
188
  if (!pageContextFromRoute._pageId) {
191
189
  const err = new Error('No routing match');
192
190
  markIs404(err);
@@ -202,8 +200,7 @@ function checkIf404(err) {
202
200
  return isObject(err) && err._is404 === true;
203
201
  }
204
202
  async function fetchPageContextFromServer(pageContext) {
205
- const urlLogical = pageContext._urlRewrite ?? pageContext._urlOriginalPristine ?? pageContext.urlOriginal;
206
- const pageContextUrl = getPageContextRequestUrl(urlLogical);
203
+ const pageContextUrl = getPageContextRequestUrl(pageContext._urlRewrite ?? pageContext.urlOriginal);
207
204
  const response = await fetch(pageContextUrl);
208
205
  {
209
206
  const contentType = response.headers.get('content-type');
@@ -1,7 +1,8 @@
1
- export { initHistoryState, getHistoryState, pushHistory, ScrollPosition, saveScrollPosition };
1
+ export { initHistoryState, getHistoryState, pushHistory, ScrollPosition, saveScrollPosition, monkeyPatchHistoryPushState };
2
2
  type HistoryState = {
3
3
  timestamp?: number;
4
4
  scrollPosition?: null | ScrollPosition;
5
+ triggedBy?: 'user' | 'vike' | 'browser';
5
6
  };
6
7
  type ScrollPosition = {
7
8
  x: number;
@@ -11,3 +12,4 @@ declare function initHistoryState(): void;
11
12
  declare function getHistoryState(): HistoryState;
12
13
  declare function saveScrollPosition(): void;
13
14
  declare function pushHistory(url: string, overwriteLastHistoryEntry: boolean): void;
15
+ declare function monkeyPatchHistoryPushState(): void;
@@ -1,10 +1,11 @@
1
- export { initHistoryState, getHistoryState, pushHistory, saveScrollPosition };
2
- import { assert, hasProp, isObject } from './utils.js';
3
- // Fill missing state information.
4
- // - The very first render => `history.state` is uninitialized (`null`).
5
- // - The vike app runs `location.hash = '#section'` => `history.state` is uninitialized (`null`).
6
- // - The user clicks on an anchor link `<a href="#section">Section</a>` => `history.state` is uninitialized (`null`).
7
- // - `history.state` set by an old vike version => state information may be incomplete. (E.g. `state.timestamp` was introduced for `pageContext.isBackwardNavigation` in `0.4.19`.)
1
+ export { initHistoryState, getHistoryState, pushHistory, saveScrollPosition, monkeyPatchHistoryPushState };
2
+ import { assert, assertUsage, hasProp, isObject } from './utils.js';
3
+ // Fill missing state information:
4
+ // - `history.state` can uninitialized (i.e. `null`):
5
+ // - The very first render
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).
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`.)
8
9
  function initHistoryState() {
9
10
  let state = window.history.state;
10
11
  if (!state) {
@@ -19,6 +20,9 @@ function initHistoryState() {
19
20
  hasModifications = true;
20
21
  state.scrollPosition = getScrollPosition();
21
22
  }
23
+ if (!('triggedBy' in state)) {
24
+ state.triggedBy = 'browser';
25
+ }
22
26
  assertState(state);
23
27
  if (hasModifications) {
24
28
  replaceHistoryState(state);
@@ -44,7 +48,7 @@ function saveScrollPosition() {
44
48
  function pushHistory(url, overwriteLastHistoryEntry) {
45
49
  if (!overwriteLastHistoryEntry) {
46
50
  const timestamp = getTimestamp();
47
- pushHistoryState({ timestamp, scrollPosition: null }, url);
51
+ pushHistoryState({ timestamp, scrollPosition: null, triggedBy: 'vike' }, url);
48
52
  }
49
53
  else {
50
54
  replaceHistoryState(getHistoryState(), url);
@@ -69,3 +73,17 @@ function replaceHistoryState(state, url) {
69
73
  function pushHistoryState(state, url) {
70
74
  window.history.pushState(state, '', url);
71
75
  }
76
+ function monkeyPatchHistoryPushState() {
77
+ const pushStateOriginal = history.pushState;
78
+ history.pushState = (stateFromUser = {}, ...rest) => {
79
+ assertUsage(null === stateFromUser || undefined === stateFromUser || isObject(stateFromUser), 'history.pushState(state) argument state must be an object');
80
+ const state = {
81
+ scrollPosition: getScrollPosition(),
82
+ timestamp: getTimestamp(),
83
+ ...stateFromUser,
84
+ // Don't allow user to overwrite triggedBy as it would break Vike's handling of the 'popstate' event
85
+ triggedBy: 'user'
86
+ };
87
+ return pushStateOriginal.apply(history, [state, ...rest]);
88
+ };
89
+ }
@@ -0,0 +1,21 @@
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
+ 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;