vike 0.4.171-commit-75e1588 → 0.4.171-commit-f9548df

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 (46) hide show
  1. package/dist/cjs/node/prerender/runPrerender.js +30 -11
  2. package/dist/cjs/node/prerender/utils.js +1 -0
  3. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
  4. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  5. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  6. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +4 -3
  7. package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
  8. package/dist/cjs/shared/route/index.js +2 -2
  9. package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
  10. package/dist/cjs/shared/utils.js +2 -0
  11. package/dist/cjs/utils/changeEnumerable.js +9 -0
  12. package/dist/cjs/utils/objectAssign.js +1 -1
  13. package/dist/cjs/utils/objectDefineProperty.js +8 -0
  14. package/dist/cjs/utils/projectInfo.js +1 -1
  15. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +4 -2
  16. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  17. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +11 -7
  18. package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
  19. package/dist/esm/node/prerender/runPrerender.js +31 -12
  20. package/dist/esm/node/prerender/utils.d.ts +1 -0
  21. package/dist/esm/node/prerender/utils.js +1 -0
  22. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
  23. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -9
  24. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  25. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  26. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  27. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +27 -50
  28. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +4 -3
  29. package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
  30. package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
  31. package/dist/esm/shared/route/index.d.ts +3 -3
  32. package/dist/esm/shared/route/index.js +2 -2
  33. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  34. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  35. package/dist/esm/shared/types.d.ts +4 -4
  36. package/dist/esm/shared/utils.d.ts +2 -0
  37. package/dist/esm/shared/utils.js +2 -0
  38. package/dist/esm/types/index.d.ts +1 -1
  39. package/dist/esm/utils/changeEnumerable.d.ts +2 -0
  40. package/dist/esm/utils/changeEnumerable.js +5 -0
  41. package/dist/esm/utils/objectAssign.js +1 -1
  42. package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
  43. package/dist/esm/utils/objectDefineProperty.js +4 -0
  44. package/dist/esm/utils/projectInfo.d.ts +2 -2
  45. package/dist/esm/utils/projectInfo.js +1 -1
  46. package/package.json +1 -1
@@ -63,13 +63,13 @@ function getRenderHook(pageContext) {
63
63
  assertUsage(false, [
64
64
  `No ${hookName}() hook found, see https://vike.dev/${hookName}`
65
65
  /*
66
- 'See https://vike.dev/render-modes for more information.',
67
- [
68
- // 'Loaded config files (none of them define the onRenderHtml() hook):',
69
- 'Loaded server-side page files (none of them `export { render }`):',
70
- ...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
71
- ].join('\n')
72
- */
66
+ 'See https://vike.dev/render-modes for more information.',
67
+ [
68
+ // 'Loaded config files (none of them define the onRenderHtml() hook):',
69
+ 'Loaded server-side page files (none of them `export { render }`):',
70
+ ...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
71
+ ].join('\n')
72
+ */
73
73
  ].join(' '));
74
74
  }
75
75
  return hookFound;
@@ -14,19 +14,11 @@ type PageContext_loadUserFilesServerSide = PageContextGetPageAssets & PageContex
14
14
  type PageFiles = PromiseType<ReturnType<typeof loadUserFilesServerSide>>;
15
15
  declare function loadUserFilesServerSide(pageContext: {
16
16
  _pageId: string;
17
- } & PageContext_loadUserFilesServerSide): Promise<{
17
+ } & PageContext_loadUserFilesServerSide): Promise<import("../../../shared/getPageFiles/getExports.js").PageContextExports & {
18
18
  Page: unknown;
19
19
  _isHtmlOnly: boolean;
20
20
  _passToClient: string[];
21
21
  _pageFilePathsLoaded: string[];
22
- source: import("../../../shared/getPageFiles/getExports.js").Source;
23
- sources: import("../../../shared/getPageFiles/getExports.js").Sources;
24
- from: import("../../../shared/getPageFiles/getExports.js").From;
25
- config: Record<string, unknown>;
26
- configEntries: import("../../../shared/getPageFiles/getExports.js").ConfigEntries;
27
- exports: Record<string, unknown>;
28
- exportsAll: import("../../../shared/getPageFiles/getExports.js").ExportsAll;
29
- pageExports: Record<string, unknown>;
30
22
  } & {
31
23
  __getPageAssets: () => Promise<PageAsset[]>;
32
24
  }>;
@@ -10,7 +10,7 @@ import { getGlobalContext } from '../globalContext.js';
10
10
  import { loadConfigValues } from '../../../shared/page-configs/loadConfigValues.js';
11
11
  async function loadUserFilesServerSide(pageContext) {
12
12
  const pageConfig = findPageConfig(pageContext._pageConfigs, pageContext._pageId); // Make pageConfig globally available as pageContext._pageConfig?
13
- const [{ pageFilesLoaded, pageConfigLoaded, ...pageContextExports }] = await Promise.all([
13
+ const [{ pageFilesLoaded, pageContextExports }] = await Promise.all([
14
14
  loadPageUserFiles(pageContext._pageFilesAll, pageConfig, pageContext._pageId, !getGlobalContext().isProduction),
15
15
  analyzePageClientSideInit(pageContext._pageFilesAll, pageContext._pageId, { sharedPageFilesAlreadyLoaded: true })
16
16
  ]);
@@ -35,8 +35,8 @@ async function loadUserFilesServerSide(pageContext) {
35
35
  });
36
36
  }
37
37
  const pageContextAddendum = {};
38
+ objectAssign(pageContextAddendum, pageContextExports);
38
39
  objectAssign(pageContextAddendum, {
39
- ...pageContextExports,
40
40
  Page: pageContextExports.exports.Page,
41
41
  _isHtmlOnly: isHtmlOnly,
42
42
  _passToClient: passToClient,
@@ -101,8 +101,7 @@ async function loadPageUserFiles(pageFilesAll, pageConfig, pageId, isDev) {
101
101
  await Promise.all(pageFilesServerSide.map((p) => p.loadFile?.()));
102
102
  const pageContextExports = getPageContextExports(pageFilesServerSide, pageConfigLoaded);
103
103
  return {
104
- ...pageContextExports,
105
- pageFilesLoaded: pageFilesServerSide,
106
- pageConfigLoaded
104
+ pageContextExports,
105
+ pageFilesLoaded: pageFilesServerSide
107
106
  };
108
107
  }
@@ -1,6 +1,6 @@
1
1
  export { preparePageContextForUserConsumptionServerSide };
2
2
  export type { PageContextForUserConsumptionServerSide };
3
- import { PageContextUrlComputedPropsInternal } from '../../../shared/addUrlComputedProps.js';
3
+ import { PageContextUrlInternal } from '../../../shared/getPageContextUrlComputed.js';
4
4
  import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
5
5
  import type { PageContextExports } from '../../../shared/getPageFiles/getExports.js';
6
6
  import { PageContextBuiltInServerInternal } from '../../../shared/types.js';
@@ -9,7 +9,7 @@ type PageContextForUserConsumptionServerSide = PageContextBuiltInServerInternal
9
9
  /** @deprecated */
10
10
  url: string;
11
11
  urlPathname: string;
12
- urlParsed: PageContextUrlComputedPropsInternal['urlParsed'];
12
+ urlParsed: PageContextUrlInternal['urlParsed'];
13
13
  routeParams: Record<string, string>;
14
14
  Page: unknown;
15
15
  _pageId: string;
@@ -1,10 +1,10 @@
1
1
  export { preparePageContextForUserConsumptionServerSide };
2
2
  import { assert, isPlainObject, isObject } from '../utils.js';
3
3
  import { sortPageContext } from '../../../shared/sortPageContext.js';
4
- import { assertPageContextUrlComputedProps } from '../../../shared/addUrlComputedProps.js';
4
+ import { assertPageContextUrl } from '../../../shared/getPageContextUrlComputed.js';
5
5
  import { addIs404ToPageProps } from '../../../shared/addIs404ToPageProps.js';
6
6
  function preparePageContextForUserConsumptionServerSide(pageContext) {
7
- assertPageContextUrlComputedProps(pageContext);
7
+ assertPageContextUrl(pageContext);
8
8
  assert(isPlainObject(pageContext.routeParams));
9
9
  assert('Page' in pageContext);
10
10
  assert(isObject(pageContext.pageExports));
@@ -7,7 +7,7 @@ export type { RenderContext };
7
7
  export type { PageContextAfterRender };
8
8
  export type { PageContextInitEnhanced };
9
9
  import { type PageFile } from '../../../shared/getPageFiles.js';
10
- import { type PageContextUrlComputedPropsInternal } from '../../../shared/addUrlComputedProps.js';
10
+ import { type PageContextUrlInternal } from '../../../shared/getPageContextUrlComputed.js';
11
11
  import { HttpResponse } from './createHttpResponseObject.js';
12
12
  import { PageContext_loadUserFilesServerSide, type PageFiles } from './loadUserFilesServerSide.js';
13
13
  import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../../../shared/page-configs/PageConfig.js';
@@ -24,7 +24,7 @@ declare function renderPageAlreadyRouted<PageContext extends {
24
24
  routeParams: Record<string, string>;
25
25
  errorWhileRendering: null | Error;
26
26
  _httpRequestId: number;
27
- } & PageContextInitEnhanced & PageContextUrlComputedPropsInternal & PageContext_loadUserFilesServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
27
+ } & PageContextInitEnhanced & PageContextUrlInternal & PageContext_loadUserFilesServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
28
28
  declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles & {
29
29
  routeParams: Record<string, string>;
30
30
  _pageId: string;
@@ -59,23 +59,17 @@ declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles
59
59
  _urlRewrite: string | null;
60
60
  _urlHandler: ((url: string) => string) | null;
61
61
  isClientSideNavigation: boolean;
62
- } & import("../../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
63
- _urlRewrite: string | null;
64
62
  } & {
65
- headers: Record<string, string> | null;
63
+ urlParsed: import("../../../shared/getPageContextUrlComputed.js").Url;
64
+ urlPathname: string;
65
+ url: string;
66
66
  } & {
67
+ headers: Record<string, string> | null;
68
+ } & import("../../../shared/getPageFiles/getExports.js").PageContextExports & {
67
69
  Page: unknown;
68
70
  _isHtmlOnly: boolean;
69
71
  _passToClient: string[];
70
72
  _pageFilePathsLoaded: string[];
71
- source: import("../../../shared/getPageFiles/getExports.js").Source;
72
- sources: import("../../../shared/getPageFiles/getExports.js").Sources;
73
- from: import("../../../shared/getPageFiles/getExports.js").From;
74
- config: Record<string, unknown>;
75
- configEntries: import("../../../shared/getPageFiles/getExports.js").ConfigEntries;
76
- exports: Record<string, unknown>;
77
- exportsAll: import("../../../shared/getPageFiles/getExports.js").ExportsAll;
78
- pageExports: Record<string, unknown>;
79
73
  } & {
80
74
  __getPageAssets: () => Promise<import("./getPageAssets.js").PageAsset[]>;
81
75
  } & {
@@ -116,23 +110,17 @@ declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles
116
110
  _urlRewrite: string | null;
117
111
  _urlHandler: ((url: string) => string) | null;
118
112
  isClientSideNavigation: boolean;
119
- } & import("../../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
120
- _urlRewrite: string | null;
121
113
  } & {
122
- headers: Record<string, string> | null;
114
+ urlParsed: import("../../../shared/getPageContextUrlComputed.js").Url;
115
+ urlPathname: string;
116
+ url: string;
123
117
  } & {
118
+ headers: Record<string, string> | null;
119
+ } & import("../../../shared/getPageFiles/getExports.js").PageContextExports & {
124
120
  Page: unknown;
125
121
  _isHtmlOnly: boolean;
126
122
  _passToClient: string[];
127
123
  _pageFilePathsLoaded: string[];
128
- source: import("../../../shared/getPageFiles/getExports.js").Source;
129
- sources: import("../../../shared/getPageFiles/getExports.js").Sources;
130
- from: import("../../../shared/getPageFiles/getExports.js").From;
131
- config: Record<string, unknown>;
132
- configEntries: import("../../../shared/getPageFiles/getExports.js").ConfigEntries;
133
- exports: Record<string, unknown>;
134
- exportsAll: import("../../../shared/getPageFiles/getExports.js").ExportsAll;
135
- pageExports: Record<string, unknown>;
136
124
  } & {
137
125
  __getPageAssets: () => Promise<import("./getPageAssets.js").PageAsset[]>;
138
126
  } & {
@@ -174,23 +162,17 @@ declare function prerender404Page(renderContext: RenderContext, pageContextInit_
174
162
  _urlRewrite: string | null;
175
163
  _urlHandler: ((url: string) => string) | null;
176
164
  isClientSideNavigation: boolean;
177
- } & import("../../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
178
- _urlRewrite: string | null;
179
165
  } & {
180
- headers: Record<string, string> | null;
166
+ urlParsed: import("../../../shared/getPageContextUrlComputed.js").Url;
167
+ urlPathname: string;
168
+ url: string;
181
169
  } & {
170
+ headers: Record<string, string> | null;
171
+ } & import("../../../shared/getPageFiles/getExports.js").PageContextExports & {
182
172
  Page: unknown;
183
173
  _isHtmlOnly: boolean;
184
174
  _passToClient: string[];
185
175
  _pageFilePathsLoaded: string[];
186
- source: import("../../../shared/getPageFiles/getExports.js").Source;
187
- sources: import("../../../shared/getPageFiles/getExports.js").Sources;
188
- from: import("../../../shared/getPageFiles/getExports.js").From;
189
- config: Record<string, unknown>;
190
- configEntries: import("../../../shared/getPageFiles/getExports.js").ConfigEntries;
191
- exports: Record<string, unknown>;
192
- exportsAll: import("../../../shared/getPageFiles/getExports.js").ExportsAll;
193
- pageExports: Record<string, unknown>;
194
176
  } & {
195
177
  __getPageAssets: () => Promise<import("./getPageAssets.js").PageAsset[]>;
196
178
  } & {
@@ -231,23 +213,17 @@ declare function prerender404Page(renderContext: RenderContext, pageContextInit_
231
213
  _urlRewrite: string | null;
232
214
  _urlHandler: ((url: string) => string) | null;
233
215
  isClientSideNavigation: boolean;
234
- } & import("../../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
235
- _urlRewrite: string | null;
236
216
  } & {
237
- headers: Record<string, string> | null;
217
+ urlParsed: import("../../../shared/getPageContextUrlComputed.js").Url;
218
+ urlPathname: string;
219
+ url: string;
238
220
  } & {
221
+ headers: Record<string, string> | null;
222
+ } & import("../../../shared/getPageFiles/getExports.js").PageContextExports & {
239
223
  Page: unknown;
240
224
  _isHtmlOnly: boolean;
241
225
  _passToClient: string[];
242
226
  _pageFilePathsLoaded: string[];
243
- source: import("../../../shared/getPageFiles/getExports.js").Source;
244
- sources: import("../../../shared/getPageFiles/getExports.js").Sources;
245
- from: import("../../../shared/getPageFiles/getExports.js").From;
246
- config: Record<string, unknown>;
247
- configEntries: import("../../../shared/getPageFiles/getExports.js").ConfigEntries;
248
- exports: Record<string, unknown>;
249
- exportsAll: import("../../../shared/getPageFiles/getExports.js").ExportsAll;
250
- pageExports: Record<string, unknown>;
251
227
  } & {
252
228
  __getPageAssets: () => Promise<import("./getPageAssets.js").PageAsset[]>;
253
229
  } & {
@@ -268,8 +244,7 @@ declare function getPageContextInitEnhanced(pageContextInit: {
268
244
  urlOriginal: string;
269
245
  headersOriginal?: unknown;
270
246
  headers?: unknown;
271
- }, renderContext: RenderContext, { urlComputedPropsNonEnumerable, ssr: { urlRewrite, urlHandler, isClientSideNavigation } }?: {
272
- urlComputedPropsNonEnumerable?: boolean;
247
+ }, renderContext: RenderContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } }?: {
273
248
  ssr?: {
274
249
  urlRewrite: null | string;
275
250
  urlHandler: null | ((url: string) => string);
@@ -298,8 +273,10 @@ declare function getPageContextInitEnhanced(pageContextInit: {
298
273
  _urlRewrite: string | null;
299
274
  _urlHandler: ((url: string) => string) | null;
300
275
  isClientSideNavigation: boolean;
301
- } & import("../../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
302
- _urlRewrite: string | null;
276
+ } & {
277
+ urlParsed: import("../../../shared/getPageContextUrlComputed.js").Url;
278
+ urlPathname: string;
279
+ url: string;
303
280
  } & {
304
281
  headers: Record<string, string> | null;
305
282
  };
@@ -8,7 +8,7 @@ import { getHtmlString } from '../html/renderHtml.js';
8
8
  import { getPageFilesAll } from '../../../shared/getPageFiles.js';
9
9
  import { assert, assertUsage, assertWarning, hasProp, normalizeHeaders, objectAssign } from '../utils.js';
10
10
  import { serializePageContextClientSide } from '../html/serializePageContextClientSide.js';
11
- import { addUrlComputedProps } from '../../../shared/addUrlComputedProps.js';
11
+ import { getPageContextUrlComputed } from '../../../shared/getPageContextUrlComputed.js';
12
12
  import { getGlobalContext } from '../globalContext.js';
13
13
  import { createHttpResponseObject, createHttpResponsePageContextJson } from './createHttpResponseObject.js';
14
14
  import { loadUserFilesServerSide } from './loadUserFilesServerSide.js';
@@ -116,7 +116,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
116
116
  objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
117
117
  return prerenderPage(pageContext);
118
118
  }
119
- function getPageContextInitEnhanced(pageContextInit, renderContext, { urlComputedPropsNonEnumerable = false, ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
119
+ function getPageContextInitEnhanced(pageContextInit, renderContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
120
120
  urlRewrite: null,
121
121
  urlHandler: null,
122
122
  isClientSideNavigation: false
@@ -144,7 +144,8 @@ function getPageContextInitEnhanced(pageContextInit, renderContext, { urlCompute
144
144
  isClientSideNavigation
145
145
  });
146
146
  // pageContext.urlParsed
147
- addUrlComputedProps(pageContextInitEnhanced, !urlComputedPropsNonEnumerable);
147
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContextInitEnhanced);
148
+ objectAssign(pageContextInitEnhanced, pageContextUrlComputed);
148
149
  // pageContext.headers
149
150
  {
150
151
  let headers;
@@ -1,9 +1,9 @@
1
- export { addUrlComputedProps };
2
- export { assertPageContextUrlComputedProps };
3
- export type { PageContextUrlComputedPropsInternal };
4
- export type { PageContextUrlComputedPropsClient };
5
- export type { PageContextUrlComputedPropsServer };
6
- export type { PageContextUrlSources };
1
+ export { getPageContextUrlComputed };
2
+ export { assertPageContextUrl };
3
+ export type { PageContextUrlInternal };
4
+ export type { PageContextUrlClient };
5
+ export type { PageContextUrlServer };
6
+ export type { PageContextUrlSource };
7
7
  export type { Url };
8
8
  type Url = {
9
9
  /** The URL origin, e.g. `https://example.com` of `https://example.com/product/42?details=yes#reviews` */
@@ -27,23 +27,24 @@ type Url = {
27
27
  /** @deprecated */
28
28
  searchString: null | string;
29
29
  };
30
- type PageContextUrlComputedPropsClient = {
30
+ type PageContextUrlComputed = {
31
+ /** Parsed information about the current URL */
32
+ urlParsed: Url;
33
+ /** The URL pathname, e.g. `/product/42` of `https://example.com/product/42?details=yes#reviews` */
34
+ urlPathname: string;
31
35
  /** @deprecated */
32
36
  url: string;
37
+ };
38
+ type PageContextUrl = {
33
39
  /** The URL of the HTTP request */
34
40
  urlOriginal: string;
35
- /** The URL pathname, e.g. `/product/42` of `https://example.com/product/42?details=yes#reviews` */
36
- urlPathname: string;
37
- /** Parsed information about the current URL */
38
- urlParsed: Url;
39
- };
40
- /** For Vike internal use */
41
- type PageContextUrlComputedPropsInternal = PageContextUrlComputedPropsClient & {
41
+ } & PageContextUrlComputed;
42
+ type PageContextUrlInternal = PageContextUrl & {
42
43
  _urlRewrite: string | null;
43
44
  };
44
- type HashProps = 'hash' | 'hashString' | 'hashOriginal';
45
- type PageContextUrlComputedPropsServer = PageContextUrlComputedPropsClient & {
46
- urlParsed: Omit<PageContextUrlComputedPropsClient['urlParsed'], HashProps> & {
45
+ type PageContextUrlClient = PageContextUrl;
46
+ type PageContextUrlServer = PageContextUrl & {
47
+ urlParsed: Omit<PageContextUrl['urlParsed'], HashProps> & {
47
48
  /** Only available on the client-side */
48
49
  hash: '';
49
50
  /** Only available on the client-side */
@@ -52,14 +53,15 @@ type PageContextUrlComputedPropsServer = PageContextUrlComputedPropsClient & {
52
53
  hashOriginal: null;
53
54
  };
54
55
  };
55
- declare function addUrlComputedProps<PageContext extends Record<string, unknown> & PageContextUrlSources>(pageContext: PageContext, enumerable?: boolean): asserts pageContext is PageContext & PageContextUrlComputedPropsInternal;
56
- type PageContextUrlSources = {
56
+ type HashProps = 'hash' | 'hashString' | 'hashOriginal';
57
+ declare function getPageContextUrlComputed(pageContext: PageContextUrlSource): PageContextUrlComputed;
58
+ type PageContextUrlSource = {
57
59
  urlOriginal: string;
58
60
  urlLogical?: string;
59
61
  _urlRewrite: string | null;
60
62
  _baseServer: string;
61
63
  _urlHandler: null | ((url: string) => string);
62
64
  };
63
- declare function assertPageContextUrlComputedProps(pageContext: {
65
+ declare function assertPageContextUrl(pageContext: {
64
66
  urlOriginal: string;
65
- } & PageContextUrlComputedPropsClient): void;
67
+ } & PageContextUrlClient): void;
@@ -1,45 +1,31 @@
1
- // URLs props need to be computed props, because the user can modify the URL e.g. with onBeforeRoute() for i18n
2
- export { addUrlComputedProps };
3
- export { assertPageContextUrlComputedProps };
4
- import { assert, parseUrl, assertWarning, isPlainObject, isPropertyGetter, isBrowser } from './utils.js';
5
- function addUrlComputedProps(pageContext, enumerable = true) {
6
- assert(pageContext.urlOriginal);
7
- if ('urlPathname' in pageContext) {
8
- assert(typeof pageContext.urlPathname === 'string');
9
- /* If the following 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'));
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'));
28
- Object.defineProperty(pageContext, 'urlPathname', {
1
+ export { getPageContextUrlComputed };
2
+ export { assertPageContextUrl };
3
+ // =====================
4
+ // File determining the URL logic.
5
+ // URLs need to be computed, because the user can modify the URL e.g. with onBeforeRoute() for i18n.
6
+ // =====================
7
+ import { objectDefineProperty } from '../utils/objectDefineProperty.js';
8
+ import { assert, parseUrl, assertWarning, isPlainObject, isPropertyGetter, isBrowser, changeEnumerable } from './utils.js';
9
+ function getPageContextUrlComputed(pageContext) {
10
+ assert(typeof pageContext.urlOriginal === 'string');
11
+ assertPageContextUrlComputed(pageContext);
12
+ const pageContextUrlComputed = {};
13
+ objectDefineProperty(pageContextUrlComputed, 'urlPathname', {
29
14
  get: urlPathnameGetter,
30
- enumerable,
15
+ enumerable: true,
31
16
  configurable: true
32
17
  });
33
- Object.defineProperty(pageContext, 'url', {
18
+ objectDefineProperty(pageContextUrlComputed, 'url', {
34
19
  get: urlGetter,
35
20
  enumerable: false,
36
21
  configurable: true
37
22
  });
38
- Object.defineProperty(pageContext, 'urlParsed', {
23
+ objectDefineProperty(pageContextUrlComputed, 'urlParsed', {
39
24
  get: urlParsedGetter,
40
- enumerable,
25
+ enumerable: true,
41
26
  configurable: true
42
27
  });
28
+ return pageContextUrlComputed;
43
29
  }
44
30
  function getUrlParsed(pageContext) {
45
31
  // We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
@@ -90,7 +76,7 @@ function urlParsedGetter() {
90
76
  const { origin, pathname, pathnameOriginal, search, searchAll, searchOriginal, hash, hashOriginal } = urlParsedOriginal;
91
77
  const hashIsAvailable = isBrowser();
92
78
  const warnHashNotAvailable = (prop) => {
93
- assertWarning(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash by design)`, { onlyOnce: true, showStackTrace: true });
79
+ assertWarning(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash)`, { onlyOnce: true, showStackTrace: true });
94
80
  };
95
81
  const urlParsed = {
96
82
  origin,
@@ -120,21 +106,43 @@ function urlParsedGetter() {
120
106
  return searchOriginal;
121
107
  }
122
108
  };
123
- makeNonEnumerable(urlParsed, 'hashString');
124
- makeNonEnumerable(urlParsed, 'searchString');
109
+ changeEnumerable(urlParsed, 'hashString', false);
110
+ changeEnumerable(urlParsed, 'searchString', false);
125
111
  if (!hashIsAvailable) {
126
- makeNonEnumerable(urlParsed, 'hash');
127
- makeNonEnumerable(urlParsed, 'hashOriginal');
112
+ changeEnumerable(urlParsed, 'hash', false);
113
+ changeEnumerable(urlParsed, 'hashOriginal', false);
128
114
  }
129
115
  return urlParsed;
130
116
  }
131
- function makeNonEnumerable(obj, prop) {
132
- const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
133
- Object.defineProperty(obj, prop, { ...descriptor, enumerable: false });
134
- }
135
- function assertPageContextUrlComputedProps(pageContext) {
117
+ function assertPageContextUrl(pageContext) {
136
118
  assert(typeof pageContext.urlOriginal === 'string');
137
119
  assert(typeof pageContext.urlPathname === 'string');
138
120
  assert(isPlainObject(pageContext.urlParsed));
139
121
  assert(pageContext.urlPathname === pageContext.urlParsed.pathname);
122
+ assertPageContextUrlComputed(pageContext);
123
+ }
124
+ function assertPageContextUrlComputed(pageContext) {
125
+ /*
126
+ If the isPropertyGetter() assertions fail then it's most likely because Object.assign() was used instead of `objectAssign()`:
127
+ ```js
128
+ const PageContextUrlComputed = getPageContextUrlComputed(pageContext)
129
+
130
+ // ❌ Breaks the property getters of pageContext set by getPageContextUrlComputed() such as pageContext.urlPathname
131
+ Object.assign(pageContext, pageContextUrlComputed)
132
+
133
+ // ❌ Also breaks property getters
134
+ const pageContext = { ...pageContextUrlComputed }
135
+
136
+ // ✅ Preserves property getters of pageContext (see objectAssign() implementation)
137
+ objectAssign(pageContext, pageContextUrlComputed)
138
+ ```
139
+ */
140
+ if ('urlPathname' in pageContext) {
141
+ assert(typeof pageContext.urlPathname === 'string');
142
+ assert(isPropertyGetter(pageContext, 'urlPathname'));
143
+ }
144
+ if ('urlParsed' in pageContext)
145
+ assert(isPropertyGetter(pageContext, 'urlParsed'));
146
+ if ('url' in pageContext)
147
+ assert(isPropertyGetter(pageContext, 'url'));
140
148
  }
@@ -4,18 +4,18 @@ export type { PageContextFromRoute };
4
4
  export type { PageRoutes };
5
5
  export type { RouteMatches };
6
6
  import type { PageFile } from '../getPageFiles.js';
7
- import { PageContextUrlComputedPropsInternal, PageContextUrlSources } from '../addUrlComputedProps.js';
7
+ import { type PageContextUrlInternal, type PageContextUrlSource } from '../getPageContextUrlComputed.js';
8
8
  import type { PageRoutes, RouteType } from './loadPageRoutes.js';
9
9
  import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../page-configs/PageConfig.js';
10
10
  import type { Hook } from '../hooks/getHook.js';
11
- type PageContextForRoute = PageContextUrlComputedPropsInternal & {
11
+ type PageContextForRoute = PageContextUrlInternal & {
12
12
  _pageFilesAll: PageFile[];
13
13
  _pageConfigs: PageConfigRuntime[];
14
14
  _allPageIds: string[];
15
15
  _pageConfigGlobal: PageConfigGlobalRuntime;
16
16
  _pageRoutes: PageRoutes;
17
17
  _onBeforeRouteHook: Hook | null;
18
- } & PageContextUrlSources;
18
+ } & PageContextUrlSource;
19
19
  type PageContextFromRoute = {
20
20
  _pageId: string | null;
21
21
  routeParams: Record<string, string>;
@@ -6,7 +6,7 @@ if (isBrowser()) {
6
6
  assertClientRouting();
7
7
  }
8
8
  import { assert, assertUsage, isPlainObject, objectAssign } from './utils.js';
9
- import { addUrlComputedProps } from '../addUrlComputedProps.js';
9
+ import { assertPageContextUrl } from '../getPageContextUrlComputed.js';
10
10
  import { resolvePrecendence } from './resolvePrecedence.js';
11
11
  import { resolveRouteString } from './resolveRouteString.js';
12
12
  import { resolveRouteFunction } from './resolveRouteFunction.js';
@@ -15,7 +15,7 @@ import { debug } from './debug.js';
15
15
  import pc from '@brillout/picocolors';
16
16
  async function route(pageContextForRoute) {
17
17
  debug('Pages routes:', pageContextForRoute._pageRoutes);
18
- addUrlComputedProps(pageContextForRoute);
18
+ assertPageContextUrl(pageContextForRoute);
19
19
  const pageContextFromRoute = {};
20
20
  // onBeforeRoute()
21
21
  const pageContextFromOnBeforeRouteHook = await executeOnBeforeRouteHook(pageContextForRoute);
@@ -2,8 +2,8 @@ export { resolveRouteFunction };
2
2
  export { assertRouteParams };
3
3
  export { assertSyncRouting };
4
4
  export { warnDeprecatedAllowKey };
5
- import { PageContextUrlComputedPropsInternal } from '../addUrlComputedProps.js';
6
- declare function resolveRouteFunction(routeFunction: Function, pageContext: PageContextUrlComputedPropsInternal, routeDefinedAtString: string): Promise<null | {
5
+ import { PageContextUrlInternal } from '../getPageContextUrlComputed.js';
6
+ declare function resolveRouteFunction(routeFunction: Function, pageContext: PageContextUrlInternal, routeDefinedAtString: string): Promise<null | {
7
7
  precedence: number | null;
8
8
  routeParams: Record<string, string>;
9
9
  }>;
@@ -2,11 +2,11 @@ export { resolveRouteFunction };
2
2
  export { assertRouteParams };
3
3
  export { assertSyncRouting };
4
4
  export { warnDeprecatedAllowKey };
5
- import { assertPageContextUrlComputedProps } from '../addUrlComputedProps.js';
5
+ import { assertPageContextUrl } from '../getPageContextUrlComputed.js';
6
6
  import { assert, assertUsage, assertWarning, hasProp, isPlainObject, isPromise } from './utils.js';
7
7
  import pc from '@brillout/picocolors';
8
8
  async function resolveRouteFunction(routeFunction, pageContext, routeDefinedAtString) {
9
- assertPageContextUrlComputedProps(pageContext);
9
+ assertPageContextUrl(pageContext);
10
10
  let result = routeFunction(pageContext);
11
11
  assertSyncRouting(result, `The Route Function ${routeDefinedAtString}`);
12
12
  // TODO/v1-release: make resolveRouteFunction() and route() sync
@@ -7,7 +7,7 @@ export { PageContextBuiltInServerInternal };
7
7
  export { PageContextBuiltInServer_deprecated as PageContextBuiltInServer };
8
8
  export { PageContextBuiltInClientWithClientRouting_deprecated as PageContextBuiltInClientWithClientRouting };
9
9
  export { PageContextBuiltInClientWithServerRouting_deprecated as PageContextBuiltInClientWithServerRouting };
10
- import type { PageContextUrlComputedPropsInternal, PageContextUrlComputedPropsClient, PageContextUrlComputedPropsServer } from './addUrlComputedProps.js';
10
+ import type { PageContextUrlInternal, PageContextUrlClient, PageContextUrlServer } from './getPageContextUrlComputed.js';
11
11
  import type { ConfigEntries, ExportsAll, From, Source, Sources } from './getPageFiles/getExports.js';
12
12
  import type { Config } from './page-configs/Config.js';
13
13
  import type { PageContextConfig } from './page-configs/Config/PageContextConfig.js';
@@ -119,7 +119,7 @@ type PageContextBuiltInCommon<Data> = {
119
119
  /** @deprecated */
120
120
  pageExports: Record<string, unknown>;
121
121
  };
122
- type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextUrlComputedPropsServer;
122
+ type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextUrlServer;
123
123
  type PageContextBuiltInClientWithClientRouting<Data> = Partial<PageContextBuiltInCommon<Data>> & Pick<PageContextBuiltInCommon<Data>, 'Page' | 'pageExports' | 'config' | 'configEntries' | 'exports' | 'exportsAll' | 'abortReason' | 'data' | 'source' | 'sources' | 'from'> & {
124
124
  /** Whether the current page is already rendered to HTML */
125
125
  isHydration: boolean;
@@ -129,7 +129,7 @@ type PageContextBuiltInClientWithClientRouting<Data> = Partial<PageContextBuiltI
129
129
  * The value is `true` when the user clicks on his browser's backward navigation button, or when invoking `history.back()`.
130
130
  */
131
131
  isBackwardNavigation: boolean | null;
132
- } & PageContextUrlComputedPropsClient;
132
+ } & PageContextUrlClient;
133
133
  type PageContextBuiltInClientWithServerRouting<Data> = Partial<PageContextBuiltInCommon<Data>> & Pick<PageContextBuiltInCommon<Data>, 'Page' | 'pageExports' | 'exports' | 'abortReason' | 'data'> & {
134
134
  /**
135
135
  * Whether the current page is already rendered to HTML.
@@ -145,7 +145,7 @@ type PageContextBuiltInClientWithServerRouting<Data> = Partial<PageContextBuiltI
145
145
  isBackwardNavigation: null;
146
146
  };
147
147
  /** For Vike internal use */
148
- type PageContextBuiltInServerInternal = Omit<PageContextBuiltInCommon<unknown> & PageContextUrlComputedPropsInternal, 'data'>;
148
+ type PageContextBuiltInServerInternal = Omit<PageContextBuiltInCommon<unknown> & PageContextUrlInternal, 'data'>;
149
149
  /** @deprecated
150
150
  * Replace:
151
151
  * ```
@@ -21,3 +21,5 @@ export * from '../utils/checkType.js';
21
21
  export * from '../utils/getValuePrintable.js';
22
22
  export * from '../utils/escapeRegex.js';
23
23
  export * from '../utils/isArray.js';
24
+ export * from '../utils/changeEnumerable.js';
25
+ export * from '../utils/objectDefineProperty.js';
@@ -25,3 +25,5 @@ export * from '../utils/checkType.js';
25
25
  export * from '../utils/getValuePrintable.js';
26
26
  export * from '../utils/escapeRegex.js';
27
27
  export * from '../utils/isArray.js';
28
+ export * from '../utils/changeEnumerable.js';
29
+ export * from '../utils/objectDefineProperty.js';
@@ -10,7 +10,7 @@ export type { Config, ConfigMeta as Meta, DataAsync, DataSync, GuardAsync, Guard
10
10
  export type { ConfigEnv } from '../shared/page-configs/PageConfig.js';
11
11
  export type { ConfigDefinition, ConfigEffect } from '../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js';
12
12
  export type { ConfigEntries } from '../shared/getPageFiles/getExports.js';
13
- export type { Url } from '../shared/addUrlComputedProps.js';
13
+ export type { Url } from '../shared/getPageContextUrlComputed.js';
14
14
  export type { InjectFilterEntry } from '../node/runtime/html/injectAssets/getHtmlTags.js';
15
15
  export { defineConfig } from './defineConfig.js';
16
16
  import type { ConfigEnv } from '../shared/page-configs/PageConfig.js';
@@ -0,0 +1,2 @@
1
+ /** Change enumerability of an object property. */
2
+ export declare function changeEnumerable(obj: Object, prop: string, enumerable: boolean): void;
@@ -0,0 +1,5 @@
1
+ /** Change enumerability of an object property. */
2
+ export function changeEnumerable(obj, prop, enumerable) {
3
+ const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
4
+ Object.defineProperty(obj, prop, { ...descriptor, enumerable });
5
+ }