vike 0.4.144-commit-f7ab002 → 0.4.144-commit-7f5e99a

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 (68) 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/getVirtualFilePageConfigs.js +1 -0
  5. package/dist/cjs/node/plugin/plugins/previewConfig.js +5 -0
  6. package/dist/cjs/node/prerender/runPrerender.js +8 -9
  7. package/dist/cjs/node/prerender/utils.js +1 -1
  8. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +1 -0
  9. package/dist/cjs/node/runtime/renderPage.js +2 -2
  10. package/dist/cjs/node/runtime/utils.js +1 -1
  11. package/dist/cjs/shared/addUrlComputedProps.js +24 -12
  12. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +11 -13
  13. package/dist/cjs/shared/route/index.js +3 -3
  14. package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
  15. package/dist/cjs/shared/utils.js +1 -1
  16. package/dist/cjs/utils/{hasPropertyGetter.js → isPropertyGetter.js} +3 -3
  17. package/dist/cjs/utils/projectInfo.js +1 -1
  18. package/dist/esm/__internal/index.d.ts +6 -3
  19. package/dist/esm/__internal/index.js +8 -3
  20. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +2 -3
  21. package/dist/esm/client/client-routing-runtime/createPageContext.js +3 -3
  22. package/dist/esm/client/client-routing-runtime/entry.js +2 -2
  23. package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +0 -1
  24. package/dist/esm/client/client-routing-runtime/getPageContext.js +3 -6
  25. package/dist/esm/client/client-routing-runtime/getPageId.d.ts +1 -1
  26. package/dist/esm/client/client-routing-runtime/getPageId.js +4 -7
  27. package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
  28. package/dist/esm/client/client-routing-runtime/history.js +26 -8
  29. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +21 -0
  30. package/dist/esm/client/client-routing-runtime/{useClientRouter.js → installClientRouter.js} +248 -242
  31. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.d.ts +8 -0
  32. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +15 -0
  33. package/dist/esm/client/client-routing-runtime/navigate.d.ts +0 -2
  34. package/dist/esm/client/client-routing-runtime/navigate.js +10 -8
  35. package/dist/esm/client/client-routing-runtime/prefetch.js +12 -5
  36. package/dist/esm/client/client-routing-runtime/skipLink.d.ts +0 -1
  37. package/dist/esm/client/client-routing-runtime/skipLink.js +1 -2
  38. package/dist/esm/client/shared/executeOnRenderClientHook.js +6 -5
  39. package/dist/esm/client/shared/getPageContextProxyForUser.js +13 -7
  40. package/dist/esm/node/plugin/plugins/commonConfig.js +0 -3
  41. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -0
  42. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +1 -0
  43. package/dist/esm/node/plugin/plugins/previewConfig.js +5 -0
  44. package/dist/esm/node/prerender/runPrerender.js +9 -10
  45. package/dist/esm/node/prerender/utils.d.ts +1 -1
  46. package/dist/esm/node/prerender/utils.js +1 -1
  47. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +1 -0
  48. package/dist/esm/node/runtime/renderPage.js +2 -2
  49. package/dist/esm/node/runtime/utils.d.ts +1 -1
  50. package/dist/esm/node/runtime/utils.js +1 -1
  51. package/dist/esm/shared/addUrlComputedProps.d.ts +1 -0
  52. package/dist/esm/shared/addUrlComputedProps.js +25 -13
  53. package/dist/esm/shared/route/executeOnBeforeRouteHook.d.ts +1 -1
  54. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +11 -13
  55. package/dist/esm/shared/route/index.d.ts +11 -9
  56. package/dist/esm/shared/route/index.js +3 -3
  57. package/dist/esm/shared/route/resolveRouteFunction.js +1 -1
  58. package/dist/esm/shared/utils.d.ts +1 -1
  59. package/dist/esm/shared/utils.js +1 -1
  60. package/dist/esm/utils/isPropertyGetter.d.ts +1 -0
  61. package/dist/esm/utils/{hasPropertyGetter.js → isPropertyGetter.js} +1 -1
  62. package/dist/esm/utils/projectInfo.d.ts +1 -1
  63. package/dist/esm/utils/projectInfo.js +1 -1
  64. package/package.json +1 -1
  65. package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.d.ts +0 -2
  66. package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.js +0 -15
  67. package/dist/esm/client/client-routing-runtime/useClientRouter.d.ts +0 -6
  68. package/dist/esm/utils/hasPropertyGetter.d.ts +0 -1
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- // Internal functions of vike needed by other plugins are exported via this file
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.getPagesAndRoutes = exports.route = void 0;
5
4
  const index_js_1 = require("../shared/route/index.js");
6
- Object.defineProperty(exports, "route", { enumerable: true, get: function () { return index_js_1.route; } });
7
5
  const globalContext_js_1 = require("../node/runtime/globalContext.js");
8
6
  const nodeEnv_js_1 = require("../utils/nodeEnv.js");
9
7
  const assert_js_1 = require("../utils/assert.js");
@@ -29,3 +27,9 @@ async function getPagesAndRoutes() {
29
27
  };
30
28
  }
31
29
  exports.getPagesAndRoutes = getPagesAndRoutes;
30
+ async function route(pageContext) {
31
+ const pageContextFromRoute = await (0, index_js_1.route)(pageContext);
32
+ // Old interface
33
+ return { pageContextAddendum: pageContextFromRoute };
34
+ }
35
+ exports.route = route;
@@ -18,9 +18,6 @@ function commonConfig() {
18
18
  return [
19
19
  {
20
20
  name: 'vike-commonConfig-1',
21
- config: () => ({
22
- appType: 'custom'
23
- }),
24
21
  configResolved(config) {
25
22
  (0, require_shim_1.installRequireShim_setUserRootDir)(config.root);
26
23
  }
@@ -23,6 +23,7 @@ function devConfig() {
23
23
  apply,
24
24
  config() {
25
25
  return {
26
+ appType: 'custom',
26
27
  optimizeDeps: {
27
28
  exclude: [
28
29
  // We exclude the vike client to be able to use `import.meta.glob()`
@@ -118,6 +118,7 @@ function getConfigValueSerialized(value, configName, definedAt) {
118
118
  serializationErrMsg = err.messageCore;
119
119
  }
120
120
  else {
121
+ // When a property getter throws an error
121
122
  console.error('Serialization error:');
122
123
  console.error(err);
123
124
  serializationErrMsg = 'see serialization error printed above';
@@ -18,6 +18,7 @@ function previewConfig() {
18
18
  apply: 'serve',
19
19
  config(config) {
20
20
  return {
21
+ appType: 'custom',
21
22
  build: {
22
23
  outDir: (0, utils_js_1.resolveOutDir)(config)
23
24
  }
@@ -28,6 +29,10 @@ function previewConfig() {
28
29
  configVike = await (0, getConfigVike_js_1.getConfigVike)(config);
29
30
  },
30
31
  configurePreviewServer(server) {
32
+ /* - Couldn't make `appType: 'mpa'` work as of npm:@brillout/vite@5.0.0-beta.14.0426910c
33
+ - This ugly hack to set appType for preview won't be need once https://github.com/vitejs/vite/pull/14855 is merged.
34
+ config.appType = 'mpa'
35
+ */
31
36
  (0, utils_js_1.markEnvAsPreview)();
32
37
  return () => {
33
38
  assertDist();
@@ -371,7 +371,7 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
371
371
  enumerable: false,
372
372
  configurable: true
373
373
  });
374
- (0, utils_js_1.assert)((0, utils_js_1.hasPropertyGetter)(pageContext, 'url'));
374
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'url'));
375
375
  (0, utils_js_1.assert)(pageContext.urlOriginal);
376
376
  pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
377
377
  });
@@ -410,7 +410,7 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
410
410
  prerenderContext.pageContexts = result.prerenderContext.pageContexts;
411
411
  prerenderContext.pageContexts.forEach((pageContext) => {
412
412
  // TODO/v1-release: remove
413
- if (!(0, utils_js_1.hasPropertyGetter)(pageContext, 'url') && pageContext.url) {
413
+ if (pageContext.url && !(0, utils_js_1.isPropertyGetter)(pageContext, 'url')) {
414
414
  (0, utils_js_1.assertWarning)(false, msgPrefix +
415
415
  ' provided pageContext.url but it should provide pageContext.urlOriginal instead, see https://vike.dev/migration/0.4.23', { onlyOnce: true });
416
416
  pageContext.urlOriginal = pageContext.url;
@@ -435,10 +435,9 @@ async function routeAndPrerender(prerenderContext, htmlFiles, prerenderPageIds,
435
435
  await Promise.all(prerenderContext.pageContexts.map((pageContext) => concurrencyLimit(async () => {
436
436
  const { urlOriginal } = pageContext;
437
437
  (0, utils_js_1.assert)(urlOriginal);
438
- const routeResult = await (0, index_js_1.route)(pageContext);
439
- (0, utils_js_1.assert)((0, utils_js_1.hasProp)(routeResult.pageContextAddendum, '_pageId', 'null') ||
440
- (0, utils_js_1.hasProp)(routeResult.pageContextAddendum, '_pageId', 'string'));
441
- if (routeResult.pageContextAddendum._pageId === null) {
438
+ const pageContextFromRoute = await (0, index_js_1.route)(pageContext);
439
+ (0, utils_js_1.assert)((0, utils_js_1.hasProp)(pageContextFromRoute, '_pageId', 'null') || (0, utils_js_1.hasProp)(pageContextFromRoute, '_pageId', 'string'));
440
+ if (pageContextFromRoute._pageId === null) {
442
441
  let hookName;
443
442
  let hookFilePath;
444
443
  if (pageContext._providedByHook) {
@@ -455,13 +454,13 @@ async function routeAndPrerender(prerenderContext, htmlFiles, prerenderPageIds,
455
454
  }
456
455
  else {
457
456
  // `prerenderHookFile` is `null` when the URL was deduced by the Filesytem Routing of `.page.js` files. The `onBeforeRoute()` can override Filesystem Routing; it is therefore expected that the deduced URL may not match any page.
458
- (0, utils_js_1.assert)(routeResult.pageContextAddendum._routingProvidedByOnBeforeRouteHook);
457
+ (0, utils_js_1.assert)(pageContextFromRoute._routingProvidedByOnBeforeRouteHook);
459
458
  // Abort since the URL doesn't correspond to any page
460
459
  return;
461
460
  }
462
461
  }
463
- (0, utils_js_1.assert)(routeResult.pageContextAddendum._pageId);
464
- (0, utils_js_1.objectAssign)(pageContext, routeResult.pageContextAddendum);
462
+ (0, utils_js_1.assert)(pageContextFromRoute._pageId);
463
+ (0, utils_js_1.objectAssign)(pageContext, pageContextFromRoute);
465
464
  const { _pageId: pageId } = pageContext;
466
465
  (0, utils_js_1.objectAssign)(pageContext, await (0, loadPageFilesServerSide_js_1.loadPageFilesServerSide)(pageContext));
467
466
  let usesClientRouter;
@@ -23,7 +23,7 @@ __exportStar(require("../../utils/objectAssign.js"), exports);
23
23
  __exportStar(require("../../utils/isObjectWithKeys.js"), exports);
24
24
  __exportStar(require("../../utils/isCallable.js"), exports);
25
25
  __exportStar(require("../../utils/getOutDirs.js"), exports);
26
- __exportStar(require("../../utils/hasPropertyGetter.js"), exports);
26
+ __exportStar(require("../../utils/isPropertyGetter.js"), exports);
27
27
  __exportStar(require("../../utils/filesystemPathHandling.js"), exports);
28
28
  __exportStar(require("../../utils/urlToFile.js"), exports);
29
29
  __exportStar(require("../../shared/hooks/executeHook.js"), exports);
@@ -58,6 +58,7 @@ function serializePageContextClientSide(pageContext) {
58
58
  msg = `${msg} Serialization error: ${err.messageCore}.`;
59
59
  }
60
60
  else {
61
+ // When a property getter throws an error
61
62
  console.warn('Serialization error:');
62
63
  console.warn(err);
63
64
  msg = `${msg} The serialization failed because of the error printed above.`;
@@ -246,8 +246,8 @@ async function renderPageNominal(pageContext) {
246
246
  }
247
247
  // Route
248
248
  {
249
- const routeResult = await (0, index_js_1.route)(pageContext);
250
- (0, utils_js_1.objectAssign)(pageContext, routeResult.pageContextAddendum);
249
+ const pageContextFromRoute = await (0, index_js_1.route)(pageContext);
250
+ (0, utils_js_1.objectAssign)(pageContext, pageContextFromRoute);
251
251
  (0, utils_js_1.objectAssign)(pageContext, { is404: pageContext._pageId ? null : true });
252
252
  if (pageContext._pageId === null) {
253
253
  const errorPageId = (0, error_page_js_1.getErrorPageId)(pageContext._pageFilesAll, pageContext._pageConfigs);
@@ -44,7 +44,7 @@ __exportStar(require("../../utils/capitalizeFirstLetter.js"), exports);
44
44
  __exportStar(require("../../utils/debugGlob.js"), exports);
45
45
  __exportStar(require("../../utils/isEquivalentError.js"), exports);
46
46
  __exportStar(require("../../utils/styleFileRE.js"), exports);
47
- __exportStar(require("../../utils/hasPropertyGetter.js"), exports);
47
+ __exportStar(require("../../utils/isPropertyGetter.js"), exports);
48
48
  __exportStar(require("../../utils/debug.js"), exports);
49
49
  __exportStar(require("../../utils/urlToFile.js"), exports);
50
50
  __exportStar(require("../../utils/getGlobalObject.js"), exports);
@@ -6,24 +6,36 @@ const utils_js_1 = require("./utils.js");
6
6
  function addUrlComputedProps(pageContext, enumerable = true) {
7
7
  (0, utils_js_1.assert)(pageContext.urlOriginal);
8
8
  if ('urlPathname' in pageContext) {
9
- (0, utils_js_1.assert)((0, utils_js_1.hasPropertyGetter)(pageContext, 'urlPathname'));
9
+ (0, utils_js_1.assert)(typeof pageContext.urlPathname === 'string');
10
+ /* If this assert() fails then it's most likely because Object.assign() was used instead of objectAssign(), i.e.:
11
+ ```js
12
+ // Add property getters such as pageContext.urlPathname to pageContext
13
+ addUrlComputedProps(pageContext)
14
+ // ❌ Breaks the property getters of pageContext set by addUrlComputedProps() such as pageContext.urlPathname
15
+ Object.assign(pageContext2, pageContext)
16
+ // ❌ Also breaks the property getters
17
+ const pageContext3 = { ...pageContext }
18
+ // ✅ Preserves property getters of pageContext (see objectAssign() implementation)
19
+ objectAssign(pageContext2, pageContext)
20
+ ```
21
+ */
22
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlPathname'));
10
23
  }
24
+ if ('urlParsed' in pageContext)
25
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlParsed'));
26
+ // TODO/v1-release: move pageContext.urlParsed to pageContext.url
27
+ if ('url' in pageContext)
28
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'url'));
11
29
  Object.defineProperty(pageContext, 'urlPathname', {
12
30
  get: urlPathnameGetter,
13
31
  enumerable,
14
32
  configurable: true
15
33
  });
16
- // TODO/v1-release: move pageContext.urlParsed to pageContext.url
17
- if ('url' in pageContext)
18
- (0, utils_js_1.assert)((0, utils_js_1.hasPropertyGetter)(pageContext, 'url'));
19
34
  Object.defineProperty(pageContext, 'url', {
20
35
  get: urlGetter,
21
36
  enumerable: false,
22
37
  configurable: true
23
38
  });
24
- if ('urlParsed' in pageContext) {
25
- (0, utils_js_1.assert)((0, utils_js_1.hasPropertyGetter)(pageContext, 'urlParsed'));
26
- }
27
39
  Object.defineProperty(pageContext, 'urlParsed', {
28
40
  get: urlParsedGetter,
29
41
  enumerable,
@@ -32,17 +44,17 @@ function addUrlComputedProps(pageContext, enumerable = true) {
32
44
  }
33
45
  exports.addUrlComputedProps = addUrlComputedProps;
34
46
  function getUrlParsed(pageContext) {
35
- // We use a url handler function because the onBeforeRoute() hook may modify pageContext.urlOriginal (e.g. for i18n)
47
+ // We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
36
48
  let urlHandler = pageContext._urlHandler;
37
49
  if (!urlHandler) {
38
50
  urlHandler = (url) => url;
39
51
  }
40
- const url = pageContext._urlRewrite ?? pageContext.urlOriginal;
41
- (0, utils_js_1.assert)(url && typeof url === 'string');
42
- const urlLogical = urlHandler(url);
52
+ let urlResolved = pageContext._urlRewrite ?? pageContext.urlLogical ?? pageContext.urlOriginal;
53
+ urlResolved = urlHandler(urlResolved);
43
54
  const baseServer = pageContext._baseServer;
55
+ (0, utils_js_1.assert)(urlResolved && typeof urlResolved === 'string');
44
56
  (0, utils_js_1.assert)(baseServer.startsWith('/'));
45
- return (0, utils_js_1.parseUrl)(urlLogical, baseServer);
57
+ return (0, utils_js_1.parseUrl)(urlResolved, baseServer);
46
58
  }
47
59
  function urlPathnameGetter() {
48
60
  const { pathname } = getUrlParsed(this);
@@ -11,6 +11,7 @@ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
11
11
  async function executeOnBeforeRouteHook(onBeforeRouteHook, pageContext) {
12
12
  let hookReturn = onBeforeRouteHook.onBeforeRoute(pageContext);
13
13
  (0, resolveRouteFunction_js_1.assertSyncRouting)(hookReturn, `The onBeforeRoute() hook ${onBeforeRouteHook.hookFilePath}`);
14
+ // TODO/v1-release: make executeOnBeforeRouteHook() and route() sync
14
15
  hookReturn = await hookReturn;
15
16
  const errPrefix = `The onBeforeRoute() hook defined by ${onBeforeRouteHook.hookFilePath}`;
16
17
  (0, utils_js_1.assertUsage)(hookReturn === null ||
@@ -28,28 +29,25 @@ async function executeOnBeforeRouteHook(onBeforeRouteHook, pageContext) {
28
29
  if ((0, utils_js_1.hasProp)(hookReturn.pageContext, 'routeParams')) {
29
30
  (0, resolveRouteFunction_js_1.assertRouteParams)(hookReturn.pageContext, `${errPrefix} returned ${picocolors_1.default.cyan('{ pageContext: { routeParams } }')} but routeParams should`);
30
31
  }
31
- const pageContextAddendumHook = {};
32
+ const deprecatedReturn = (prop) => `${errPrefix} returned ${picocolors_1.default.cyan(`{ pageContext: { ${prop} } }`)} which is deprecated. Return ${picocolors_1.default.cyan('{ pageContext: { urlLogical } }')} instead.`;
32
33
  if ((0, utils_js_1.hasProp)(hookReturn.pageContext, 'url')) {
33
- (0, utils_js_1.assertWarning)(false, `${errPrefix} returned ${picocolors_1.default.cyan('{ pageContext: { url } }')} but ${picocolors_1.default.cyan('pageContext.url')} has been renamed to ${picocolors_1.default.cyan('pageContext.urlOriginal')}. Return ${picocolors_1.default.cyan('{ pageContext: { urlOriginal } }')} instead. (See https://vike.dev/migration/0.4.23 for more information.)`, { onlyOnce: true });
34
- hookReturn.pageContext.urlOriginal = hookReturn.pageContext.url;
34
+ (0, utils_js_1.assertWarning)(false, deprecatedReturn('url'), { onlyOnce: true });
35
+ hookReturn.pageContext.urlLogical = hookReturn.pageContext.url;
35
36
  delete hookReturn.pageContext.url;
36
37
  }
37
38
  if ((0, utils_js_1.hasProp)(hookReturn.pageContext, 'urlOriginal')) {
38
- (0, utils_js_1.assertUsageUrl)(hookReturn.pageContext.urlOriginal, `${errPrefix} returned ${picocolors_1.default.cyan('{ pageContext: { urlOriginal } }')} but ${picocolors_1.default.cyan('urlOriginal')}`);
39
- // Ugly workaround: ideally urlOriginal should be immutable.
40
- // - Instead of using pageContext._urlOriginalPristine, maybe we can keep pageContext.urlOriginal immutable while re-using `pageContext._urlRewrite`.
41
- // - Or better yet we rename pageContext._urlRewrite to pageContext.urlLogical and we allow the user to override pageContext.urlLogical, and we rename pageContext.urlOriginal => `pageContext.urlReal`.
42
- // - pageContext.urlReal / pageContext.urlLogical
43
- // VS
44
- // pageContext.urlReal / pageContext.urlModified
45
- // VS
46
- // pageContext.urlOriginal / pageContext.urlModified
47
- (0, utils_js_1.objectAssign)(pageContextAddendumHook, { _urlOriginalPristine: pageContext.urlOriginal });
39
+ (0, utils_js_1.assertWarning)(false, deprecatedReturn('urlOriginal'), { onlyOnce: true });
40
+ hookReturn.pageContext.urlLogical = hookReturn.pageContext.urlOriginal;
41
+ delete hookReturn.pageContext.urlOriginal;
42
+ }
43
+ if ((0, utils_js_1.hasProp)(hookReturn.pageContext, 'urlLogical')) {
44
+ (0, utils_js_1.assertUsageUrl)(hookReturn.pageContext.urlLogical, `${errPrefix} returned ${picocolors_1.default.cyan('{ pageContext: { urlLogical } }')} but ${picocolors_1.default.cyan('urlLogical')}`);
48
45
  }
49
46
  (0, assertPageContextProvidedByUser_js_1.assertPageContextProvidedByUser)(hookReturn.pageContext, {
50
47
  hookFilePath: onBeforeRouteHook.hookFilePath,
51
48
  hookName: 'onBeforeRoute'
52
49
  });
50
+ const pageContextAddendumHook = {};
53
51
  (0, utils_js_1.objectAssign)(pageContextAddendumHook, hookReturn.pageContext);
54
52
  return pageContextAddendumHook;
55
53
  }
@@ -38,7 +38,7 @@ async function route(pageContext) {
38
38
  _routingProvidedByOnBeforeRouteHook: true,
39
39
  _routeMatches: 'CUSTOM_ROUTE'
40
40
  });
41
- return { pageContextAddendum };
41
+ return pageContextAddendum;
42
42
  }
43
43
  // We already assign so that `pageContext.urlOriginal === pageContextAddendum.urlOriginal`; enabling the `onBeforeRoute()` hook to mutate `pageContext.urlOriginal` before routing.
44
44
  (0, utils_js_1.objectAssign)(pageContext, pageContextAddendum);
@@ -104,7 +104,7 @@ async function route(pageContext) {
104
104
  _pageId: null,
105
105
  routeParams: {}
106
106
  });
107
- return { pageContextAddendum };
107
+ return pageContextAddendum;
108
108
  }
109
109
  {
110
110
  const { routeParams } = winner;
@@ -114,6 +114,6 @@ async function route(pageContext) {
114
114
  routeParams: winner.routeParams
115
115
  });
116
116
  }
117
- return { pageContextAddendum };
117
+ return pageContextAddendum;
118
118
  }
119
119
  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-7f5e99a';
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;
@@ -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,5 +1,5 @@
1
1
  export { getPageId };
2
- declare function getPageId(url: string): Promise<{
2
+ declare function getPageId(urlOriginal: string): Promise<{
3
3
  pageId: null;
4
4
  pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
5
5
  pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
@@ -1,15 +1,12 @@
1
1
  export { getPageId };
2
2
  import { route } from '../../shared/route/index.js';
3
3
  import { createPageContext } from './createPageContext.js';
4
- async function getPageId(url) {
5
- const pageContext = await createPageContext({ urlOriginal: url });
6
- const routeContext = await route(pageContext);
4
+ async function getPageId(urlOriginal) {
5
+ const pageContext = await createPageContext(urlOriginal);
7
6
  const pageFilesAll = pageContext._pageFilesAll;
8
7
  const pageConfigs = pageContext._pageConfigs;
9
- if (!('pageContextAddendum' in routeContext)) {
10
- return { pageId: null, pageFilesAll, pageConfigs };
11
- }
12
- const pageId = routeContext.pageContextAddendum._pageId;
8
+ const pageContextFromRoute = await route(pageContext);
9
+ const pageId = pageContextFromRoute._pageId;
13
10
  if (!pageId) {
14
11
  return { pageId: null, pageFilesAll, pageConfigs };
15
12
  }
@@ -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;