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
@@ -54,6 +54,7 @@ function serializePageContextClientSide(pageContext) {
54
54
  msg = `${msg} Serialization error: ${err.messageCore}.`;
55
55
  }
56
56
  else {
57
+ // When a property getter throws an error
57
58
  console.warn('Serialization error:');
58
59
  console.warn(err);
59
60
  msg = `${msg} The serialization failed because of the error printed above.`;
@@ -1,11 +1,11 @@
1
1
  export { debugPageFiles };
2
- export type { PageContextDebug };
3
- import { RouteMatches } from '../../../shared/route/index.js';
2
+ export type { PageContextDebugRouteMatches };
3
+ import type { RouteMatches } from '../../../shared/route/index.js';
4
4
  import type { ClientDependency } from '../../../shared/getPageFiles/analyzePageClientSide/ClientDependency.js';
5
5
  import type { PageFile } from '../../../shared/getPageFiles.js';
6
6
  import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
7
- type PageContextDebug = {
8
- _routeMatches: 'ROUTE_ERROR' | RouteMatches;
7
+ type PageContextDebugRouteMatches = {
8
+ _debugRouteMatches: 'ROUTING_ERROR' | RouteMatches;
9
9
  };
10
10
  declare function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, pageFilesLoaded, pageFilesServerSide, pageFilesClientSide, clientEntries, clientDependencies }: {
11
11
  pageContext: {
@@ -13,7 +13,7 @@ declare function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, page
13
13
  _pageId: string;
14
14
  _pageFilesAll: PageFile[];
15
15
  _pageConfigs: PageConfigRuntime[];
16
- } & PageContextDebug;
16
+ } & PageContextDebugRouteMatches;
17
17
  isHtmlOnly: boolean;
18
18
  isClientRouting: boolean;
19
19
  pageFilesLoaded: PageFile[];
@@ -6,7 +6,7 @@ function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, pageFilesLoa
6
6
  const padding = ' - ';
7
7
  debug('All page files:', printPageFiles(pageContext._pageFilesAll, true)); // TODO
8
8
  debug(`URL:`, pageContext.urlOriginal);
9
- debug.options({ serialization: { emptyArray: 'No match' } })(`Routing:`, printRouteMatches(pageContext._routeMatches));
9
+ debug.options({ serialization: { emptyArray: 'No match' } })(`Routing:`, printRouteMatches(pageContext._debugRouteMatches));
10
10
  debug(`pageId:`, pageContext._pageId);
11
11
  debug('Page type:', isHtmlOnly ? 'HTML-only' : 'SSR/SPA');
12
12
  debug(`Routing type:`, !isHtmlOnly && isClientRouting ? 'Client Routing' : 'Server Routing');
@@ -16,14 +16,14 @@ function debugPageFiles({ pageContext, isHtmlOnly, isClientRouting, pageFilesLoa
16
16
  debug('Client-side entries:', clientEntries);
17
17
  debug('Client-side dependencies:', clientDependencies);
18
18
  return;
19
- function printRouteMatches(routeMatches) {
20
- if (routeMatches === 'ROUTE_ERROR') {
19
+ function printRouteMatches(debugRouteMatches) {
20
+ if (debugRouteMatches === 'ROUTING_ERROR') {
21
21
  return 'Routing Failed';
22
22
  }
23
- if (routeMatches === 'CUSTOM_ROUTE') {
23
+ if (debugRouteMatches === 'CUSTOM_ROUTING') {
24
24
  return 'Custom Routing';
25
25
  }
26
- return routeMatches;
26
+ return debugRouteMatches;
27
27
  }
28
28
  function printPageFiles(pageFiles, genericPageFilesLast = false) {
29
29
  if (pageFiles.length === 0) {
@@ -4,9 +4,9 @@ export type { PageContext_loadPageFilesServerSide };
4
4
  import { type PageFile } from '../../../shared/getPageFiles.js';
5
5
  import { PromiseType } from '../utils.js';
6
6
  import { PageContextGetPageAssets, type PageAsset } from './getPageAssets.js';
7
- import { type PageContextDebug } from './debugPageFiles.js';
7
+ import { type PageContextDebugRouteMatches } from './debugPageFiles.js';
8
8
  import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
9
- type PageContext_loadPageFilesServerSide = PageContextGetPageAssets & PageContextDebug & {
9
+ type PageContext_loadPageFilesServerSide = PageContextGetPageAssets & PageContextDebugRouteMatches & {
10
10
  urlOriginal: string;
11
11
  _pageFilesAll: PageFile[];
12
12
  _pageConfigs: PageConfigRuntime[];
@@ -102,7 +102,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
102
102
  routeParams: {},
103
103
  // `prerender404Page()` is about generating `dist/client/404.html` for static hosts; there is no Client Routing.
104
104
  _usesClientRouter: false,
105
- _routeMatches: []
105
+ _debugRouteMatches: []
106
106
  };
107
107
  const pageContextInit = {
108
108
  urlOriginal: '/fake-404-url',
@@ -240,8 +240,8 @@ async function renderPageNominal(pageContext) {
240
240
  }
241
241
  // Route
242
242
  {
243
- const routeResult = await route(pageContext);
244
- objectAssign(pageContext, routeResult.pageContextAddendum);
243
+ const pageContextFromRoute = await route(pageContext);
244
+ objectAssign(pageContext, pageContextFromRoute);
245
245
  objectAssign(pageContext, { is404: pageContext._pageId ? null : true });
246
246
  if (pageContext._pageId === null) {
247
247
  const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._pageConfigs);
@@ -268,7 +268,7 @@ async function getPageContextErrorPageInit(pageContextInit, errNominalPage, page
268
268
  routeParams: {}
269
269
  };
270
270
  objectAssign(pageContext, {
271
- _routeMatches: pageContextNominalPagePartial._routeMatches || 'ROUTE_ERROR'
271
+ _debugRouteMatches: pageContextNominalPagePartial._debugRouteMatches || 'ROUTING_ERROR'
272
272
  });
273
273
  assert(pageContext.errorWhileRendering);
274
274
  return pageContext;
@@ -25,7 +25,7 @@ export * from '../../utils/capitalizeFirstLetter.js';
25
25
  export * from '../../utils/debugGlob.js';
26
26
  export * from '../../utils/isEquivalentError.js';
27
27
  export * from '../../utils/styleFileRE.js';
28
- export * from '../../utils/hasPropertyGetter.js';
28
+ export * from '../../utils/isPropertyGetter.js';
29
29
  export * from '../../utils/debug.js';
30
30
  export * from '../../utils/urlToFile.js';
31
31
  export * from '../../utils/getGlobalObject.js';
@@ -28,7 +28,7 @@ export * from '../../utils/capitalizeFirstLetter.js';
28
28
  export * from '../../utils/debugGlob.js';
29
29
  export * from '../../utils/isEquivalentError.js';
30
30
  export * from '../../utils/styleFileRE.js';
31
- export * from '../../utils/hasPropertyGetter.js';
31
+ export * from '../../utils/isPropertyGetter.js';
32
32
  export * from '../../utils/debug.js';
33
33
  export * from '../../utils/urlToFile.js';
34
34
  export * from '../../utils/getGlobalObject.js';
@@ -55,6 +55,7 @@ type PageContextUrlComputedPropsServer = PageContextUrlComputedPropsClient & {
55
55
  declare function addUrlComputedProps<PageContext extends Record<string, unknown> & PageContextUrlSources>(pageContext: PageContext, enumerable?: boolean): asserts pageContext is PageContext & PageContextUrlComputedPropsInternal;
56
56
  type PageContextUrlSources = {
57
57
  urlOriginal: string;
58
+ urlLogical?: string;
58
59
  _urlRewrite: string | null;
59
60
  _baseServer: string;
60
61
  _urlHandler: null | ((url: string) => string);
@@ -1,28 +1,40 @@
1
1
  // URLs props need to be computed props, because the user can modify the URL e.g. with onBeforeRoute() for i18n
2
2
  export { addUrlComputedProps };
3
3
  export { assertPageContextUrlComputedProps };
4
- import { assert, parseUrl, assertWarning, isPlainObject, hasPropertyGetter, isBrowser } from './utils.js';
4
+ import { assert, parseUrl, assertWarning, isPlainObject, isPropertyGetter, isBrowser } from './utils.js';
5
5
  function addUrlComputedProps(pageContext, enumerable = true) {
6
6
  assert(pageContext.urlOriginal);
7
7
  if ('urlPathname' in pageContext) {
8
- assert(hasPropertyGetter(pageContext, 'urlPathname'));
8
+ assert(typeof pageContext.urlPathname === 'string');
9
+ /* If this assert() fails then it's most likely because Object.assign() was used instead of objectAssign(), i.e.:
10
+ ```js
11
+ // Add property getters such as pageContext.urlPathname to pageContext
12
+ addUrlComputedProps(pageContext)
13
+ // ❌ Breaks the property getters of pageContext set by addUrlComputedProps() such as pageContext.urlPathname
14
+ Object.assign(pageContext2, pageContext)
15
+ // ❌ Also breaks the property getters
16
+ const pageContext3 = { ...pageContext }
17
+ // ✅ Preserves property getters of pageContext (see objectAssign() implementation)
18
+ objectAssign(pageContext2, pageContext)
19
+ ```
20
+ */
21
+ assert(isPropertyGetter(pageContext, 'urlPathname'));
9
22
  }
23
+ if ('urlParsed' in pageContext)
24
+ assert(isPropertyGetter(pageContext, 'urlParsed'));
25
+ // TODO/v1-release: move pageContext.urlParsed to pageContext.url
26
+ if ('url' in pageContext)
27
+ assert(isPropertyGetter(pageContext, 'url'));
10
28
  Object.defineProperty(pageContext, 'urlPathname', {
11
29
  get: urlPathnameGetter,
12
30
  enumerable,
13
31
  configurable: true
14
32
  });
15
- // TODO/v1-release: move pageContext.urlParsed to pageContext.url
16
- if ('url' in pageContext)
17
- assert(hasPropertyGetter(pageContext, 'url'));
18
33
  Object.defineProperty(pageContext, 'url', {
19
34
  get: urlGetter,
20
35
  enumerable: false,
21
36
  configurable: true
22
37
  });
23
- if ('urlParsed' in pageContext) {
24
- assert(hasPropertyGetter(pageContext, 'urlParsed'));
25
- }
26
38
  Object.defineProperty(pageContext, 'urlParsed', {
27
39
  get: urlParsedGetter,
28
40
  enumerable,
@@ -30,17 +42,17 @@ function addUrlComputedProps(pageContext, enumerable = true) {
30
42
  });
31
43
  }
32
44
  function getUrlParsed(pageContext) {
33
- // We use a url handler function because the onBeforeRoute() hook may modify pageContext.urlOriginal (e.g. for i18n)
45
+ // We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
34
46
  let urlHandler = pageContext._urlHandler;
35
47
  if (!urlHandler) {
36
48
  urlHandler = (url) => url;
37
49
  }
38
- const url = pageContext._urlRewrite ?? pageContext.urlOriginal;
39
- assert(url && typeof url === 'string');
40
- const urlLogical = urlHandler(url);
50
+ let urlResolved = pageContext._urlRewrite ?? pageContext.urlLogical ?? pageContext.urlOriginal;
51
+ urlResolved = urlHandler(urlResolved);
41
52
  const baseServer = pageContext._baseServer;
53
+ assert(urlResolved && typeof urlResolved === 'string');
42
54
  assert(baseServer.startsWith('/'));
43
- return parseUrl(urlLogical, baseServer);
55
+ return parseUrl(urlResolved, baseServer);
44
56
  }
45
57
  function urlPathnameGetter() {
46
58
  const { pathname } = getUrlParsed(this);
@@ -1,3 +1,4 @@
1
+ import type { PageContextForRoute, PageContextFromRoute } from './index.js';
1
2
  export { executeOnBeforeRouteHook };
2
3
  export type { OnBeforeRouteHook };
3
4
  type OnBeforeRouteHook = {
@@ -6,12 +7,8 @@ type OnBeforeRouteHook = {
6
7
  urlOriginal: string;
7
8
  } & Record<string, unknown>) => unknown;
8
9
  };
9
- declare function executeOnBeforeRouteHook(onBeforeRouteHook: OnBeforeRouteHook, pageContext: {
10
- urlOriginal: string;
11
- _allPageIds: string[];
12
- }): Promise<null | {
13
- urlOriginal?: string;
14
- _urlOriginalPristine?: string;
15
- _pageId?: string | null;
16
- routeParams?: Record<string, string>;
10
+ declare function executeOnBeforeRouteHook(pageContext: PageContextForRoute): Promise<null | ({
11
+ _routingProvidedByOnBeforeRouteHook: true;
12
+ } & PageContextFromRoute) | {
13
+ _routingProvidedByOnBeforeRouteHook: false;
17
14
  }>;
@@ -1,11 +1,40 @@
1
1
  import { assertPageContextProvidedByUser } from '../assertPageContextProvidedByUser.js';
2
- import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrl, joinEnglish } from './utils.js';
2
+ import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrl, joinEnglish, assert } from './utils.js';
3
3
  import { assertRouteParams, assertSyncRouting } from './resolveRouteFunction.js';
4
4
  import pc from '@brillout/picocolors';
5
5
  export { executeOnBeforeRouteHook };
6
- async function executeOnBeforeRouteHook(onBeforeRouteHook, pageContext) {
6
+ async function executeOnBeforeRouteHook(pageContext) {
7
+ const pageContextFromOnBeforeRouteHook = {};
8
+ if (!pageContext._onBeforeRouteHook)
9
+ return null;
10
+ const pageContextFromHook = await executeHook(pageContext._onBeforeRouteHook, pageContext);
11
+ if (pageContextFromHook) {
12
+ objectAssign(pageContextFromOnBeforeRouteHook, pageContextFromHook);
13
+ if (hasProp(pageContextFromOnBeforeRouteHook, '_pageId', 'string') ||
14
+ hasProp(pageContextFromOnBeforeRouteHook, '_pageId', 'null')) {
15
+ // We bypass Vike's routing
16
+ if (!hasProp(pageContextFromOnBeforeRouteHook, 'routeParams')) {
17
+ objectAssign(pageContextFromOnBeforeRouteHook, { routeParams: {} });
18
+ }
19
+ else {
20
+ assert(hasProp(pageContextFromOnBeforeRouteHook, 'routeParams', 'object'));
21
+ }
22
+ objectAssign(pageContextFromOnBeforeRouteHook, {
23
+ _routingProvidedByOnBeforeRouteHook: true,
24
+ _debugRouteMatches: 'CUSTOM_ROUTING'
25
+ });
26
+ return pageContextFromOnBeforeRouteHook;
27
+ }
28
+ }
29
+ objectAssign(pageContextFromOnBeforeRouteHook, {
30
+ _routingProvidedByOnBeforeRouteHook: false
31
+ });
32
+ return pageContextFromOnBeforeRouteHook;
33
+ }
34
+ async function executeHook(onBeforeRouteHook, pageContext) {
7
35
  let hookReturn = onBeforeRouteHook.onBeforeRoute(pageContext);
8
36
  assertSyncRouting(hookReturn, `The onBeforeRoute() hook ${onBeforeRouteHook.hookFilePath}`);
37
+ // TODO/v1-release: make executeOnBeforeRouteHook() and route() sync
9
38
  hookReturn = await hookReturn;
10
39
  const errPrefix = `The onBeforeRoute() hook defined by ${onBeforeRouteHook.hookFilePath}`;
11
40
  assertUsage(hookReturn === null ||
@@ -23,28 +52,25 @@ async function executeOnBeforeRouteHook(onBeforeRouteHook, pageContext) {
23
52
  if (hasProp(hookReturn.pageContext, 'routeParams')) {
24
53
  assertRouteParams(hookReturn.pageContext, `${errPrefix} returned ${pc.cyan('{ pageContext: { routeParams } }')} but routeParams should`);
25
54
  }
26
- const pageContextAddendumHook = {};
55
+ const deprecatedReturn = (prop) => `${errPrefix} returned ${pc.cyan(`{ pageContext: { ${prop} } }`)} which is deprecated. Return ${pc.cyan('{ pageContext: { urlLogical } }')} instead.`;
27
56
  if (hasProp(hookReturn.pageContext, 'url')) {
28
- assertWarning(false, `${errPrefix} returned ${pc.cyan('{ pageContext: { url } }')} but ${pc.cyan('pageContext.url')} has been renamed to ${pc.cyan('pageContext.urlOriginal')}. Return ${pc.cyan('{ pageContext: { urlOriginal } }')} instead. (See https://vike.dev/migration/0.4.23 for more information.)`, { onlyOnce: true });
29
- hookReturn.pageContext.urlOriginal = hookReturn.pageContext.url;
57
+ assertWarning(false, deprecatedReturn('url'), { onlyOnce: true });
58
+ hookReturn.pageContext.urlLogical = hookReturn.pageContext.url;
30
59
  delete hookReturn.pageContext.url;
31
60
  }
32
61
  if (hasProp(hookReturn.pageContext, 'urlOriginal')) {
33
- assertUsageUrl(hookReturn.pageContext.urlOriginal, `${errPrefix} returned ${pc.cyan('{ pageContext: { urlOriginal } }')} but ${pc.cyan('urlOriginal')}`);
34
- // Ugly workaround: ideally urlOriginal should be immutable.
35
- // - Instead of using pageContext._urlOriginalPristine, maybe we can keep pageContext.urlOriginal immutable while re-using `pageContext._urlRewrite`.
36
- // - 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`.
37
- // - pageContext.urlReal / pageContext.urlLogical
38
- // VS
39
- // pageContext.urlReal / pageContext.urlModified
40
- // VS
41
- // pageContext.urlOriginal / pageContext.urlModified
42
- objectAssign(pageContextAddendumHook, { _urlOriginalPristine: pageContext.urlOriginal });
62
+ assertWarning(false, deprecatedReturn('urlOriginal'), { onlyOnce: true });
63
+ hookReturn.pageContext.urlLogical = hookReturn.pageContext.urlOriginal;
64
+ delete hookReturn.pageContext.urlOriginal;
65
+ }
66
+ if (hasProp(hookReturn.pageContext, 'urlLogical')) {
67
+ assertUsageUrl(hookReturn.pageContext.urlLogical, `${errPrefix} returned ${pc.cyan('{ pageContext: { urlLogical } }')} but ${pc.cyan('urlLogical')}`);
43
68
  }
44
69
  assertPageContextProvidedByUser(hookReturn.pageContext, {
45
70
  hookFilePath: onBeforeRouteHook.hookFilePath,
46
71
  hookName: 'onBeforeRoute'
47
72
  });
73
+ const pageContextAddendumHook = {};
48
74
  objectAssign(pageContextAddendumHook, hookReturn.pageContext);
49
75
  return pageContextAddendumHook;
50
76
  }
@@ -1,5 +1,8 @@
1
1
  export { route };
2
- export type { PageRoutes, PageContextForRoute, RouteMatches };
2
+ export type { PageContextForRoute };
3
+ export type { PageContextFromRoute };
4
+ export type { PageRoutes };
5
+ export type { RouteMatches };
3
6
  import type { PageFile } from '../getPageFiles.js';
4
7
  import { PageContextUrlComputedPropsInternal, PageContextUrlSources } from '../addUrlComputedProps.js';
5
8
  import { type OnBeforeRouteHook } from './executeOnBeforeRouteHook.js';
@@ -13,6 +16,12 @@ type PageContextForRoute = PageContextUrlComputedPropsInternal & {
13
16
  _pageRoutes: PageRoutes;
14
17
  _onBeforeRouteHook: OnBeforeRouteHook | null;
15
18
  } & PageContextUrlSources;
19
+ type PageContextFromRoute = {
20
+ _pageId: string | null;
21
+ routeParams: Record<string, string>;
22
+ _routingProvidedByOnBeforeRouteHook?: boolean;
23
+ _debugRouteMatches: RouteMatches;
24
+ };
16
25
  type RouteMatch = {
17
26
  pageId: string;
18
27
  routeString?: string;
@@ -20,12 +29,5 @@ type RouteMatch = {
20
29
  routeType: RouteType;
21
30
  routeParams: Record<string, string>;
22
31
  };
23
- type RouteMatches = 'CUSTOM_ROUTE' | RouteMatch[];
24
- declare function route(pageContext: PageContextForRoute): Promise<{
25
- pageContextAddendum: {
26
- _pageId: string | null;
27
- routeParams: Record<string, string>;
28
- _routingProvidedByOnBeforeRouteHook: boolean;
29
- _routeMatches: RouteMatches;
30
- } & Record<string, unknown>;
31
- }>;
32
+ type RouteMatches = 'CUSTOM_ROUTING' | RouteMatch[];
33
+ declare function route(pageContextForRoute: PageContextForRoute): Promise<PageContextFromRoute>;
@@ -5,7 +5,7 @@ import { isBrowser } from '../../utils/isBrowser.js';
5
5
  if (isBrowser()) {
6
6
  assertClientRouting();
7
7
  }
8
- import { assert, assertUsage, hasProp, isPlainObject, objectAssign } from './utils.js';
8
+ import { assert, assertUsage, isPlainObject, objectAssign } from './utils.js';
9
9
  import { addUrlComputedProps } from '../addUrlComputedProps.js';
10
10
  import { resolvePrecendence } from './resolvePrecedence.js';
11
11
  import { resolveRouteString } from './resolveRouteString.js';
@@ -13,35 +13,25 @@ import { resolveRouteFunction } from './resolveRouteFunction.js';
13
13
  import { executeOnBeforeRouteHook } from './executeOnBeforeRouteHook.js';
14
14
  import { debug } from './debug.js';
15
15
  import pc from '@brillout/picocolors';
16
- async function route(pageContext) {
17
- addUrlComputedProps(pageContext);
18
- debug('Pages routes:', pageContext._pageRoutes);
19
- const pageContextAddendum = {};
20
- if (pageContext._onBeforeRouteHook) {
21
- const pageContextAddendumHook = await executeOnBeforeRouteHook(pageContext._onBeforeRouteHook, pageContext);
22
- if (pageContextAddendumHook) {
23
- objectAssign(pageContextAddendum, pageContextAddendumHook);
24
- if (hasProp(pageContextAddendum, '_pageId', 'string') || hasProp(pageContextAddendum, '_pageId', 'null')) {
25
- // We bypass Vike's routing
26
- if (!hasProp(pageContextAddendum, 'routeParams')) {
27
- objectAssign(pageContextAddendum, { routeParams: {} });
28
- }
29
- else {
30
- assert(hasProp(pageContextAddendum, 'routeParams', 'object'));
31
- }
32
- objectAssign(pageContextAddendum, {
33
- _routingProvidedByOnBeforeRouteHook: true,
34
- _routeMatches: 'CUSTOM_ROUTE'
35
- });
36
- return { pageContextAddendum };
37
- }
38
- // We already assign so that `pageContext.urlOriginal === pageContextAddendum.urlOriginal`; enabling the `onBeforeRoute()` hook to mutate `pageContext.urlOriginal` before routing.
39
- objectAssign(pageContext, pageContextAddendum);
16
+ async function route(pageContextForRoute) {
17
+ debug('Pages routes:', pageContextForRoute._pageRoutes);
18
+ addUrlComputedProps(pageContextForRoute);
19
+ const pageContextFromRoute = {};
20
+ // onBeforeRoute()
21
+ const pageContextFromOnBeforeRouteHook = await executeOnBeforeRouteHook(pageContextForRoute);
22
+ if (pageContextFromOnBeforeRouteHook) {
23
+ if (pageContextFromOnBeforeRouteHook._routingProvidedByOnBeforeRouteHook) {
24
+ assert(pageContextFromOnBeforeRouteHook._pageId);
25
+ return pageContextFromOnBeforeRouteHook;
26
+ }
27
+ else {
28
+ objectAssign(pageContextFromRoute, pageContextFromOnBeforeRouteHook);
40
29
  }
41
30
  }
42
- objectAssign(pageContextAddendum, {
43
- _routingProvidedByOnBeforeRouteHook: false
44
- });
31
+ // We take into account pageContext.urlLogical set by onBeforeRoute()
32
+ const pageContext = {};
33
+ objectAssign(pageContext, pageContextForRoute);
34
+ objectAssign(pageContext, pageContextFromOnBeforeRouteHook);
45
35
  // Vike's routing
46
36
  const allPageIds = pageContext._allPageIds;
47
37
  assert(allPageIds.length >= 0);
@@ -93,21 +83,21 @@ async function route(pageContext) {
93
83
  resolvePrecendence(routeMatches);
94
84
  const winner = routeMatches[0];
95
85
  debug(`Route matches for URL ${pc.cyan(urlPathname)} (in precedence order):`, routeMatches);
96
- objectAssign(pageContextAddendum, { _routeMatches: routeMatches });
86
+ objectAssign(pageContextFromRoute, { _debugRouteMatches: routeMatches });
97
87
  if (!winner) {
98
- objectAssign(pageContextAddendum, {
88
+ objectAssign(pageContextFromRoute, {
99
89
  _pageId: null,
100
90
  routeParams: {}
101
91
  });
102
- return { pageContextAddendum };
92
+ return pageContextFromRoute;
103
93
  }
104
94
  {
105
95
  const { routeParams } = winner;
106
96
  assert(isPlainObject(routeParams));
107
- objectAssign(pageContextAddendum, {
97
+ objectAssign(pageContextFromRoute, {
108
98
  _pageId: winner.pageId,
109
99
  routeParams: winner.routeParams
110
100
  });
111
101
  }
112
- return { pageContextAddendum };
102
+ return pageContextFromRoute;
113
103
  }
@@ -9,7 +9,7 @@ async function resolveRouteFunction(routeFunction, pageContext, routeDefinedAt)
9
9
  assertPageContextUrlComputedProps(pageContext);
10
10
  let result = routeFunction(pageContext);
11
11
  assertSyncRouting(result, `The Route Function ${routeDefinedAt}`);
12
- // TODO/v1-release
12
+ // TODO/v1-release: make resolveRouteFunction() and route() sync
13
13
  //* 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
14
14
  result = await result;
15
15
  //*/
@@ -15,7 +15,7 @@ export * from '../utils/stringifyStringArray.js';
15
15
  export * from '../utils/filesystemPathHandling.js';
16
16
  export * from '../utils/cast.js';
17
17
  export * from '../utils/projectInfo.js';
18
- export * from '../utils/hasPropertyGetter.js';
18
+ export * from '../utils/isPropertyGetter.js';
19
19
  export * from '../utils/isPromise.js';
20
20
  export * from '../utils/checkType.js';
21
21
  export * from '../utils/objectEntries.js';
@@ -19,7 +19,7 @@ export * from '../utils/stringifyStringArray.js';
19
19
  export * from '../utils/filesystemPathHandling.js';
20
20
  export * from '../utils/cast.js';
21
21
  export * from '../utils/projectInfo.js';
22
- export * from '../utils/hasPropertyGetter.js';
22
+ export * from '../utils/isPropertyGetter.js';
23
23
  export * from '../utils/isPromise.js';
24
24
  export * from '../utils/checkType.js';
25
25
  export * from '../utils/objectEntries.js';
@@ -0,0 +1 @@
1
+ export declare function isPropertyGetter(obj: Object, prop: string): boolean;
@@ -1,4 +1,4 @@
1
- export function hasPropertyGetter(obj, prop) {
1
+ export function isPropertyGetter(obj, prop) {
2
2
  const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
3
3
  return !!descriptor && !('value' in descriptor) && !!descriptor.get;
4
4
  }
@@ -5,7 +5,7 @@ type ProjectVersion = typeof projectInfo.projectVersion;
5
5
  type ProjectTag = `[${PackageName}]` | `[${PackageName}@${ProjectVersion}]`;
6
6
  declare const projectInfo: {
7
7
  projectName: "Vike";
8
- projectVersion: "0.4.144-commit-f7ab002";
8
+ projectVersion: "0.4.144-commit-de18325";
9
9
  npmPackageName: "vike";
10
10
  githubRepository: "https://github.com/vikejs/vike";
11
11
  };
@@ -1,6 +1,6 @@
1
1
  export { projectInfo };
2
2
  import { onProjectInfo } from './assertSingleInstance.js';
3
- const PROJECT_VERSION = '0.4.144-commit-f7ab002';
3
+ const PROJECT_VERSION = '0.4.144-commit-de18325';
4
4
  const projectInfo = {
5
5
  projectName: 'Vike',
6
6
  projectVersion: PROJECT_VERSION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.144-commit-f7ab002",
3
+ "version": "0.4.144-commit-de18325",
4
4
  "scripts": {
5
5
  "dev": "tsc --watch",
6
6
  "build": "rimraf dist/ && pnpm run build:esm && pnpm run build:cjs",
@@ -1,10 +0,0 @@
1
- export { getPageId };
2
- declare function getPageId(url: string): Promise<{
3
- pageId: null;
4
- pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
5
- pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
6
- } | {
7
- pageId: string;
8
- pageFilesAll: import("../../shared/getPageFiles/getPageFileObject.js").PageFile[];
9
- pageConfigs: import("../../shared/page-configs/PageConfig.js").PageConfigRuntime[];
10
- }>;
@@ -1,17 +0,0 @@
1
- export { getPageId };
2
- import { route } from '../../shared/route/index.js';
3
- import { createPageContext } from './createPageContext.js';
4
- async function getPageId(url) {
5
- const pageContext = await createPageContext({ urlOriginal: url });
6
- const routeContext = await route(pageContext);
7
- const pageFilesAll = pageContext._pageFilesAll;
8
- const pageConfigs = pageContext._pageConfigs;
9
- if (!('pageContextAddendum' in routeContext)) {
10
- return { pageId: null, pageFilesAll, pageConfigs };
11
- }
12
- const pageId = routeContext.pageContextAddendum._pageId;
13
- if (!pageId) {
14
- return { pageId: null, pageFilesAll, pageConfigs };
15
- }
16
- return { pageId, pageFilesAll, pageConfigs };
17
- }
@@ -1,2 +0,0 @@
1
- export { isClientSideRoutable };
2
- declare function isClientSideRoutable(url: string): Promise<boolean>;
@@ -1,15 +0,0 @@
1
- export { isClientSideRoutable };
2
- import { getPageId } from '../getPageId.js';
3
- import { analyzePageClientSideInit } from '../../../shared/getPageFiles/analyzePageClientSide.js';
4
- import { findPageConfig } from '../../../shared/page-configs/findPageConfig.js';
5
- import { analyzeClientSide } from '../../../shared/getPageFiles/analyzeClientSide.js';
6
- async function isClientSideRoutable(url) {
7
- const { pageId, pageFilesAll, pageConfigs } = await getPageId(url);
8
- if (!pageId) {
9
- return false;
10
- }
11
- await analyzePageClientSideInit(pageFilesAll, pageId, { sharedPageFilesAlreadyLoaded: false });
12
- const pageConfig = findPageConfig(pageConfigs, pageId);
13
- const { isClientSideRenderable, isClientRouting } = analyzeClientSide(pageConfig, pageFilesAll, pageId);
14
- return isClientSideRenderable && isClientRouting;
15
- }
@@ -1,6 +0,0 @@
1
- export { useClientRouter };
2
- export { disableClientRouting };
3
- export { isDisableAutomaticLinkInterception };
4
- declare function disableClientRouting(err: unknown, log: boolean): void;
5
- declare function useClientRouter(): void;
6
- declare function isDisableAutomaticLinkInterception(): boolean;
@@ -1 +0,0 @@
1
- export declare function hasPropertyGetter(obj: Object, prop: string): boolean;