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
@@ -44,7 +44,7 @@ const helpers_js_1 = require("../../shared/page-configs/helpers.js");
44
44
  const getConfigValue_js_1 = require("../../shared/page-configs/getConfigValue.js");
45
45
  const loadConfigValues_js_1 = require("../../shared/page-configs/loadConfigValues.js");
46
46
  const error_page_js_1 = require("../../shared/error-page.js");
47
- const addUrlComputedProps_js_1 = require("../../shared/addUrlComputedProps.js");
47
+ const getPageContextUrlComputed_js_1 = require("../../shared/getPageContextUrlComputed.js");
48
48
  const abort_js_1 = require("../../shared/route/abort.js");
49
49
  const loadUserFilesServerSide_js_1 = require("../runtime/renderPage/loadUserFilesServerSide.js");
50
50
  const getHook_js_1 = require("../../shared/hooks/getHook.js");
@@ -268,9 +268,9 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
268
268
  prerenderContext.pageContexts.push(pageContextNew);
269
269
  if (pageContext) {
270
270
  (0, utils_js_1.objectAssign)(pageContextNew, {
271
- _pageContextAlreadyProvidedByOnPrerenderHook: true,
272
- ...pageContext
271
+ _pageContextAlreadyProvidedByOnPrerenderHook: true
273
272
  });
273
+ (0, utils_js_1.objectAssign)(pageContextNew, pageContext);
274
274
  }
275
275
  });
276
276
  })));
@@ -328,14 +328,11 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
328
328
  _prerenderContext: prerenderContext
329
329
  };
330
330
  const pageContextInit = {
331
- urlOriginal,
332
- ...prerenderContext.pageContextInit
331
+ urlOriginal
333
332
  };
333
+ (0, utils_js_1.objectAssign)(pageContextInit, prerenderContext.pageContextInit);
334
334
  {
335
- const pageContextInitEnhanced = (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, renderContext, {
336
- // We set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in a onPrerenderStart() hook, e.g. /examples/i18n/
337
- urlComputedPropsNonEnumerable: true
338
- });
335
+ const pageContextInitEnhanced = (0, renderPageAlreadyRouted_js_1.getPageContextInitEnhanced)(pageContextInit, renderContext);
339
336
  (0, utils_js_1.objectAssign)(pageContext, pageContextInitEnhanced);
340
337
  }
341
338
  return pageContext;
@@ -410,6 +407,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
410
407
  pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
411
408
  });
412
409
  const docLink = 'https://vike.dev/i18n#pre-rendering';
410
+ // Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
411
+ const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
413
412
  let result = await (0, executeHook_js_1.executeHook)(() => hookFn({
414
413
  pageContexts: prerenderContext.pageContexts,
415
414
  // TODO/v1-release: remove warning
@@ -421,6 +420,7 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
421
420
  return prerenderContext.pageContexts;
422
421
  }
423
422
  }), onPrerenderStartHook, null);
423
+ restoreEnumerable();
424
424
  if (result === null || result === undefined) {
425
425
  return;
426
426
  }
@@ -458,9 +458,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
458
458
  hookName
459
459
  };
460
460
  }
461
- // Restore as URL computed props are lost when user makes a pageContext copy
462
- (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContext);
463
461
  });
462
+ addPageContextComputedUrl(prerenderContext.pageContexts);
464
463
  }
465
464
  async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete) {
466
465
  const globalContext = (0, globalContext_js_1.getGlobalContext)();
@@ -743,3 +742,23 @@ function assertIsNotAbort(err, urlOr404) {
743
742
  (0, utils_js_1.assert)(abortCall);
744
743
  (0, utils_js_1.assertUsage)(false, `${picocolors_1.default.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${picocolors_1.default.cyan(abortCaller)} isn't supported for pre-rendered pages`);
745
744
  }
745
+ function makePageContextComputedUrlNonEnumerable(pageContexts) {
746
+ change(false);
747
+ return { restoreEnumerable, addPageContextComputedUrl };
748
+ function restoreEnumerable() {
749
+ change(true);
750
+ }
751
+ function addPageContextComputedUrl(pageContexts) {
752
+ // Add URL computed props to the user-generated pageContext copies
753
+ pageContexts.forEach((pageContext) => {
754
+ const pageContextUrlComputed = (0, getPageContextUrlComputed_js_1.getPageContextUrlComputed)(pageContext);
755
+ (0, utils_js_1.objectAssign)(pageContext, pageContextUrlComputed);
756
+ });
757
+ }
758
+ function change(enumerable) {
759
+ pageContexts.forEach((pageContext) => {
760
+ (0, utils_js_1.changeEnumerable)(pageContext, 'urlPathname', enumerable);
761
+ (0, utils_js_1.changeEnumerable)(pageContext, 'urlParsed', enumerable);
762
+ });
763
+ }
764
+ }
@@ -31,3 +31,4 @@ __exportStar(require("../../utils/assertNodeEnv.js"), exports);
31
31
  __exportStar(require("../../utils/pLimit.js"), exports);
32
32
  __exportStar(require("../../utils/assertPathFilesystemAbsolute.js"), exports);
33
33
  __exportStar(require("../../utils/isArray.js"), exports);
34
+ __exportStar(require("../../utils/changeEnumerable.js"), exports);
@@ -69,13 +69,13 @@ function getRenderHook(pageContext) {
69
69
  (0, utils_js_1.assertUsage)(false, [
70
70
  `No ${hookName}() hook found, see https://vike.dev/${hookName}`
71
71
  /*
72
- 'See https://vike.dev/render-modes for more information.',
73
- [
74
- // 'Loaded config files (none of them define the onRenderHtml() hook):',
75
- 'Loaded server-side page files (none of them `export { render }`):',
76
- ...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
77
- ].join('\n')
78
- */
72
+ 'See https://vike.dev/render-modes for more information.',
73
+ [
74
+ // 'Loaded config files (none of them define the onRenderHtml() hook):',
75
+ 'Loaded server-side page files (none of them `export { render }`):',
76
+ ...pageContext._pageFilePathsLoaded.map((f, i) => ` (${i + 1}): ${f}`)
77
+ ].join('\n')
78
+ */
79
79
  ].join(' '));
80
80
  }
81
81
  return hookFound;
@@ -12,7 +12,7 @@ const globalContext_js_1 = require("../globalContext.js");
12
12
  const loadConfigValues_js_1 = require("../../../shared/page-configs/loadConfigValues.js");
13
13
  async function loadUserFilesServerSide(pageContext) {
14
14
  const pageConfig = (0, findPageConfig_js_1.findPageConfig)(pageContext._pageConfigs, pageContext._pageId); // Make pageConfig globally available as pageContext._pageConfig?
15
- const [{ pageFilesLoaded, pageConfigLoaded, ...pageContextExports }] = await Promise.all([
15
+ const [{ pageFilesLoaded, pageContextExports }] = await Promise.all([
16
16
  loadPageUserFiles(pageContext._pageFilesAll, pageConfig, pageContext._pageId, !(0, globalContext_js_1.getGlobalContext)().isProduction),
17
17
  (0, analyzePageClientSide_js_1.analyzePageClientSideInit)(pageContext._pageFilesAll, pageContext._pageId, { sharedPageFilesAlreadyLoaded: true })
18
18
  ]);
@@ -37,8 +37,8 @@ async function loadUserFilesServerSide(pageContext) {
37
37
  });
38
38
  }
39
39
  const pageContextAddendum = {};
40
+ (0, utils_js_1.objectAssign)(pageContextAddendum, pageContextExports);
40
41
  (0, utils_js_1.objectAssign)(pageContextAddendum, {
41
- ...pageContextExports,
42
42
  Page: pageContextExports.exports.Page,
43
43
  _isHtmlOnly: isHtmlOnly,
44
44
  _passToClient: passToClient,
@@ -104,8 +104,7 @@ async function loadPageUserFiles(pageFilesAll, pageConfig, pageId, isDev) {
104
104
  await Promise.all(pageFilesServerSide.map((p) => p.loadFile?.()));
105
105
  const pageContextExports = (0, getPageFiles_js_1.getPageContextExports)(pageFilesServerSide, pageConfigLoaded);
106
106
  return {
107
- ...pageContextExports,
108
- pageFilesLoaded: pageFilesServerSide,
109
- pageConfigLoaded
107
+ pageContextExports,
108
+ pageFilesLoaded: pageFilesServerSide
110
109
  };
111
110
  }
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.preparePageContextForUserConsumptionServerSide = void 0;
4
4
  const utils_js_1 = require("../utils.js");
5
5
  const sortPageContext_js_1 = require("../../../shared/sortPageContext.js");
6
- const addUrlComputedProps_js_1 = require("../../../shared/addUrlComputedProps.js");
6
+ const getPageContextUrlComputed_js_1 = require("../../../shared/getPageContextUrlComputed.js");
7
7
  const addIs404ToPageProps_js_1 = require("../../../shared/addIs404ToPageProps.js");
8
8
  function preparePageContextForUserConsumptionServerSide(pageContext) {
9
- (0, addUrlComputedProps_js_1.assertPageContextUrlComputedProps)(pageContext);
9
+ (0, getPageContextUrlComputed_js_1.assertPageContextUrl)(pageContext);
10
10
  (0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(pageContext.routeParams));
11
11
  (0, utils_js_1.assert)('Page' in pageContext);
12
12
  (0, utils_js_1.assert)((0, utils_js_1.isObject)(pageContext.pageExports));
@@ -9,7 +9,7 @@ const renderHtml_js_1 = require("../html/renderHtml.js");
9
9
  const getPageFiles_js_1 = require("../../../shared/getPageFiles.js");
10
10
  const utils_js_1 = require("../utils.js");
11
11
  const serializePageContextClientSide_js_1 = require("../html/serializePageContextClientSide.js");
12
- const addUrlComputedProps_js_1 = require("../../../shared/addUrlComputedProps.js");
12
+ const getPageContextUrlComputed_js_1 = require("../../../shared/getPageContextUrlComputed.js");
13
13
  const globalContext_js_1 = require("../globalContext.js");
14
14
  const createHttpResponseObject_js_1 = require("./createHttpResponseObject.js");
15
15
  const loadUserFilesServerSide_js_1 = require("./loadUserFilesServerSide.js");
@@ -120,7 +120,7 @@ async function prerender404Page(renderContext, pageContextInit_) {
120
120
  return prerenderPage(pageContext);
121
121
  }
122
122
  exports.prerender404Page = prerender404Page;
123
- function getPageContextInitEnhanced(pageContextInit, renderContext, { urlComputedPropsNonEnumerable = false, ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
123
+ function getPageContextInitEnhanced(pageContextInit, renderContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
124
124
  urlRewrite: null,
125
125
  urlHandler: null,
126
126
  isClientSideNavigation: false
@@ -148,7 +148,8 @@ function getPageContextInitEnhanced(pageContextInit, renderContext, { urlCompute
148
148
  isClientSideNavigation
149
149
  });
150
150
  // pageContext.urlParsed
151
- (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContextInitEnhanced, !urlComputedPropsNonEnumerable);
151
+ const pageContextUrlComputed = (0, getPageContextUrlComputed_js_1.getPageContextUrlComputed)(pageContextInitEnhanced);
152
+ (0, utils_js_1.objectAssign)(pageContextInitEnhanced, pageContextUrlComputed);
152
153
  // pageContext.headers
153
154
  {
154
155
  let headers;
@@ -1,48 +1,34 @@
1
1
  "use strict";
2
- // URLs props need to be computed props, because the user can modify the URL e.g. with onBeforeRoute() for i18n
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.assertPageContextUrlComputedProps = exports.addUrlComputedProps = void 0;
3
+ exports.assertPageContextUrl = exports.getPageContextUrlComputed = void 0;
4
+ // =====================
5
+ // File determining the URL logic.
6
+ // URLs need to be computed, because the user can modify the URL e.g. with onBeforeRoute() for i18n.
7
+ // =====================
8
+ const objectDefineProperty_js_1 = require("../utils/objectDefineProperty.js");
5
9
  const utils_js_1 = require("./utils.js");
6
- function addUrlComputedProps(pageContext, enumerable = true) {
7
- (0, utils_js_1.assert)(pageContext.urlOriginal);
8
- if ('urlPathname' in pageContext) {
9
- (0, utils_js_1.assert)(typeof pageContext.urlPathname === 'string');
10
- /* If the following 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'));
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'));
29
- Object.defineProperty(pageContext, 'urlPathname', {
10
+ function getPageContextUrlComputed(pageContext) {
11
+ (0, utils_js_1.assert)(typeof pageContext.urlOriginal === 'string');
12
+ assertPageContextUrlComputed(pageContext);
13
+ const pageContextUrlComputed = {};
14
+ (0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'urlPathname', {
30
15
  get: urlPathnameGetter,
31
- enumerable,
16
+ enumerable: true,
32
17
  configurable: true
33
18
  });
34
- Object.defineProperty(pageContext, 'url', {
19
+ (0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'url', {
35
20
  get: urlGetter,
36
21
  enumerable: false,
37
22
  configurable: true
38
23
  });
39
- Object.defineProperty(pageContext, 'urlParsed', {
24
+ (0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'urlParsed', {
40
25
  get: urlParsedGetter,
41
- enumerable,
26
+ enumerable: true,
42
27
  configurable: true
43
28
  });
29
+ return pageContextUrlComputed;
44
30
  }
45
- exports.addUrlComputedProps = addUrlComputedProps;
31
+ exports.getPageContextUrlComputed = getPageContextUrlComputed;
46
32
  function getUrlParsed(pageContext) {
47
33
  // We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
48
34
  let urlHandler = pageContext._urlHandler;
@@ -92,7 +78,7 @@ function urlParsedGetter() {
92
78
  const { origin, pathname, pathnameOriginal, search, searchAll, searchOriginal, hash, hashOriginal } = urlParsedOriginal;
93
79
  const hashIsAvailable = (0, utils_js_1.isBrowser)();
94
80
  const warnHashNotAvailable = (prop) => {
95
- (0, utils_js_1.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 });
81
+ (0, utils_js_1.assertWarning)(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash)`, { onlyOnce: true, showStackTrace: true });
96
82
  };
97
83
  const urlParsed = {
98
84
  origin,
@@ -122,22 +108,44 @@ function urlParsedGetter() {
122
108
  return searchOriginal;
123
109
  }
124
110
  };
125
- makeNonEnumerable(urlParsed, 'hashString');
126
- makeNonEnumerable(urlParsed, 'searchString');
111
+ (0, utils_js_1.changeEnumerable)(urlParsed, 'hashString', false);
112
+ (0, utils_js_1.changeEnumerable)(urlParsed, 'searchString', false);
127
113
  if (!hashIsAvailable) {
128
- makeNonEnumerable(urlParsed, 'hash');
129
- makeNonEnumerable(urlParsed, 'hashOriginal');
114
+ (0, utils_js_1.changeEnumerable)(urlParsed, 'hash', false);
115
+ (0, utils_js_1.changeEnumerable)(urlParsed, 'hashOriginal', false);
130
116
  }
131
117
  return urlParsed;
132
118
  }
133
- function makeNonEnumerable(obj, prop) {
134
- const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
135
- Object.defineProperty(obj, prop, { ...descriptor, enumerable: false });
136
- }
137
- function assertPageContextUrlComputedProps(pageContext) {
119
+ function assertPageContextUrl(pageContext) {
138
120
  (0, utils_js_1.assert)(typeof pageContext.urlOriginal === 'string');
139
121
  (0, utils_js_1.assert)(typeof pageContext.urlPathname === 'string');
140
122
  (0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(pageContext.urlParsed));
141
123
  (0, utils_js_1.assert)(pageContext.urlPathname === pageContext.urlParsed.pathname);
124
+ assertPageContextUrlComputed(pageContext);
125
+ }
126
+ exports.assertPageContextUrl = assertPageContextUrl;
127
+ function assertPageContextUrlComputed(pageContext) {
128
+ /*
129
+ If the isPropertyGetter() assertions fail then it's most likely because Object.assign() was used instead of `objectAssign()`:
130
+ ```js
131
+ const PageContextUrlComputed = getPageContextUrlComputed(pageContext)
132
+
133
+ // ❌ Breaks the property getters of pageContext set by getPageContextUrlComputed() such as pageContext.urlPathname
134
+ Object.assign(pageContext, pageContextUrlComputed)
135
+
136
+ // ❌ Also breaks property getters
137
+ const pageContext = { ...pageContextUrlComputed }
138
+
139
+ // ✅ Preserves property getters of pageContext (see objectAssign() implementation)
140
+ objectAssign(pageContext, pageContextUrlComputed)
141
+ ```
142
+ */
143
+ if ('urlPathname' in pageContext) {
144
+ (0, utils_js_1.assert)(typeof pageContext.urlPathname === 'string');
145
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlPathname'));
146
+ }
147
+ if ('urlParsed' in pageContext)
148
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'urlParsed'));
149
+ if ('url' in pageContext)
150
+ (0, utils_js_1.assert)((0, utils_js_1.isPropertyGetter)(pageContext, 'url'));
142
151
  }
143
- exports.assertPageContextUrlComputedProps = assertPageContextUrlComputedProps;
@@ -11,7 +11,7 @@ if ((0, isBrowser_js_1.isBrowser)()) {
11
11
  (0, assertRoutingType_js_1.assertClientRouting)();
12
12
  }
13
13
  const utils_js_1 = require("./utils.js");
14
- const addUrlComputedProps_js_1 = require("../addUrlComputedProps.js");
14
+ const getPageContextUrlComputed_js_1 = require("../getPageContextUrlComputed.js");
15
15
  const resolvePrecedence_js_1 = require("./resolvePrecedence.js");
16
16
  const resolveRouteString_js_1 = require("./resolveRouteString.js");
17
17
  const resolveRouteFunction_js_1 = require("./resolveRouteFunction.js");
@@ -20,7 +20,7 @@ const debug_js_1 = require("./debug.js");
20
20
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
21
21
  async function route(pageContextForRoute) {
22
22
  (0, debug_js_1.debug)('Pages routes:', pageContextForRoute._pageRoutes);
23
- (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContextForRoute);
23
+ (0, getPageContextUrlComputed_js_1.assertPageContextUrl)(pageContextForRoute);
24
24
  const pageContextFromRoute = {};
25
25
  // onBeforeRoute()
26
26
  const pageContextFromOnBeforeRouteHook = await (0, executeOnBeforeRouteHook_js_1.executeOnBeforeRouteHook)(pageContextForRoute);
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.warnDeprecatedAllowKey = exports.assertSyncRouting = exports.assertRouteParams = exports.resolveRouteFunction = void 0;
7
- const addUrlComputedProps_js_1 = require("../addUrlComputedProps.js");
7
+ const getPageContextUrlComputed_js_1 = require("../getPageContextUrlComputed.js");
8
8
  const utils_js_1 = require("./utils.js");
9
9
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
10
10
  async function resolveRouteFunction(routeFunction, pageContext, routeDefinedAtString) {
11
- (0, addUrlComputedProps_js_1.assertPageContextUrlComputedProps)(pageContext);
11
+ (0, getPageContextUrlComputed_js_1.assertPageContextUrl)(pageContext);
12
12
  let result = routeFunction(pageContext);
13
13
  assertSyncRouting(result, `The Route Function ${routeDefinedAtString}`);
14
14
  // TODO/v1-release: make resolveRouteFunction() and route() sync
@@ -41,3 +41,5 @@ __exportStar(require("../utils/checkType.js"), exports);
41
41
  __exportStar(require("../utils/getValuePrintable.js"), exports);
42
42
  __exportStar(require("../utils/escapeRegex.js"), exports);
43
43
  __exportStar(require("../utils/isArray.js"), exports);
44
+ __exportStar(require("../utils/changeEnumerable.js"), exports);
45
+ __exportStar(require("../utils/objectDefineProperty.js"), exports);
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.changeEnumerable = void 0;
4
+ /** Change enumerability of an object property. */
5
+ function changeEnumerable(obj, prop, enumerable) {
6
+ const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
7
+ Object.defineProperty(obj, prop, { ...descriptor, enumerable });
8
+ }
9
+ exports.changeEnumerable = changeEnumerable;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.objectAssign = void 0;
4
4
  // Same as Object.assign() but:
5
5
  // - With type inference
6
- // - Preserves property descriptors, which we need for preserving the getters added by addUrlComputedProps()
6
+ // - Preserves property descriptors, which we need for preserving the getters added by getPageContextUrlComputed()
7
7
  function objectAssign(obj, objAddendum) {
8
8
  if (objAddendum) {
9
9
  Object.defineProperties(obj, Object.getOwnPropertyDescriptors(objAddendum));
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.objectDefineProperty = void 0;
4
+ /** Like Object.defineProperty() but with type inference */
5
+ function objectDefineProperty(obj, prop, { get, ...args }) {
6
+ Object.defineProperty(obj, prop, { ...args, get });
7
+ }
8
+ exports.objectDefineProperty = objectDefineProperty;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PROJECT_VERSION = exports.projectInfo = void 0;
4
- const PROJECT_VERSION = '0.4.171-commit-75e1588';
4
+ const PROJECT_VERSION = '0.4.171-commit-f9548df';
5
5
  exports.PROJECT_VERSION = PROJECT_VERSION;
6
6
  const projectInfo = {
7
7
  projectName: 'Vike',
@@ -11,6 +11,8 @@ declare function createPageContext(urlOriginal: string): Promise<{
11
11
  _allPageIds: string[];
12
12
  _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
13
13
  _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
14
- } & import("../../shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & {
15
- _urlRewrite: string | null;
14
+ } & {
15
+ urlParsed: import("../../shared/getPageContextUrlComputed.js").Url;
16
+ urlPathname: string;
17
+ url: string;
16
18
  }>;
@@ -1,9 +1,9 @@
1
1
  export { createPageContext };
2
- import { addUrlComputedProps } from '../../shared/addUrlComputedProps.js';
2
+ import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.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, getGlobalObject } from './utils.js';
6
+ import { assert, isBaseServer, getGlobalObject, objectAssign } from './utils.js';
7
7
  const globalObject = getGlobalObject('createPageContext.ts', {});
8
8
  async function createPageContext(urlOriginal) {
9
9
  if (!globalObject.pageFilesData) {
@@ -26,6 +26,7 @@ async function createPageContext(urlOriginal) {
26
26
  _pageRoutes: pageRoutes,
27
27
  _onBeforeRouteHook: onBeforeRouteHook
28
28
  };
29
- addUrlComputedProps(pageContext);
29
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContext);
30
+ objectAssign(pageContext, pageContextUrlComputed);
30
31
  return pageContext;
31
32
  }
@@ -32,7 +32,9 @@ async function getPageContextFromHooks_isHydration(pageContext) {
32
32
  _hasPageContextFromServer: true
33
33
  };
34
34
  for (const hookName of ['data', 'onBeforeRender']) {
35
- const pageContextForHook = { ...pageContext, ...pageContextFromHooks };
35
+ const pageContextForHook = {};
36
+ objectAssign(pageContextForHook, pageContext);
37
+ objectAssign(pageContextForHook, pageContextFromHooks);
36
38
  if (hookClientOnlyExists(hookName, pageContextForHook)) {
37
39
  const pageContextFromHook = await executeHookClientSide(hookName, pageContextForHook);
38
40
  Object.assign(pageContextFromHooks, pageContextFromHook);
@@ -45,6 +47,9 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
45
47
  isHydration: false,
46
48
  _hasPageContextFromClient: false
47
49
  };
50
+ const pageContextForCondition = {};
51
+ objectAssign(pageContextForCondition, pageContext);
52
+ objectAssign(pageContextForCondition, pageContextFromHooks);
48
53
  let hasPageContextFromServer = false;
49
54
  // If pageContextInit has some client data or if one of the hooks guard(), data() or onBeforeRender() is server-side
50
55
  // only, then we need to fetch pageContext from the server.
@@ -53,7 +58,7 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
53
58
  // For the error page, we cannot fetch pageContext from the server because the pageContext JSON request is based on the URL
54
59
  !isErrorPage &&
55
60
  // true if pageContextInit has some client data or at least one of the data() and onBeforeRender() hooks is server-side only:
56
- (await hasPageContextServer({ ...pageContext, ...pageContextFromHooks }))) {
61
+ (await hasPageContextServer(pageContextForCondition))) {
57
62
  const res = await fetchPageContextFromServer(pageContext);
58
63
  if ('is404ServerSideRouted' in res)
59
64
  return { is404ServerSideRouted: true };
@@ -70,11 +75,10 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
70
75
  // Note: for the error page, we also execute the client-side data() and onBeforeRender() hooks, but maybe we
71
76
  // shouldn't? The server-side does it as well (but maybe it shouldn't).
72
77
  for (const hookName of ['guard', 'data', 'onBeforeRender']) {
73
- const pageContextForHook = {
74
- _hasPageContextFromServer: hasPageContextFromServer,
75
- ...pageContext,
76
- ...pageContextFromHooks
77
- };
78
+ const pageContextForHook = {};
79
+ objectAssign(pageContextForHook, { _hasPageContextFromServer: hasPageContextFromServer });
80
+ objectAssign(pageContextForHook, pageContext);
81
+ objectAssign(pageContextForHook, pageContextFromHooks);
78
82
  if (hookName === 'guard') {
79
83
  if (!isErrorPage &&
80
84
  // We don't need to call guard() on the client-side if we fetch pageContext from the server side. (Because the `${url}.pageContext.json` HTTP request will already trigger the routing and guard() hook on the server-side.)
@@ -3,6 +3,7 @@ export { isErrorFetchingStaticAssets };
3
3
  import { getPageFilesClientSide, getPageContextExports } from '../../shared/getPageFiles.js';
4
4
  import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
5
5
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
6
+ import { objectAssign } from '../server-routing-runtime/utils.js';
6
7
  const stamp = '__whileFetchingAssets';
7
8
  async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
8
9
  const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
@@ -29,10 +30,9 @@ async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
29
30
  throw err;
30
31
  }
31
32
  const pageContextExports = getPageContextExports(pageFilesClientSide, pageConfigLoaded);
32
- const pageContextAddendum = {
33
- ...pageContextExports,
34
- _pageFilesLoaded: pageFilesClientSide
35
- };
33
+ const pageContextAddendum = {};
34
+ objectAssign(pageContextAddendum, pageContextExports);
35
+ objectAssign(pageContextAddendum, { _pageFilesLoaded: pageFilesClientSide });
36
36
  return pageContextAddendum;
37
37
  }
38
38
  function isErrorFetchingStaticAssets(err) {
@@ -5,7 +5,7 @@ export { runPrerender_forceExit };
5
5
  import '../runtime/page-files/setup.js';
6
6
  import path from 'path';
7
7
  import { route } from '../../shared/route/index.js';
8
- import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertPathFilesystemAbsolute, isArray } from './utils.js';
8
+ import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertPathFilesystemAbsolute, isArray, changeEnumerable } from './utils.js';
9
9
  import { prerenderPage, prerender404Page, getRenderContext, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
10
10
  import pc from '@brillout/picocolors';
11
11
  import { cpus } from 'os';
@@ -19,7 +19,7 @@ import { getConfigValueFilePathToShowToUser } from '../../shared/page-configs/he
19
19
  import { getConfigValue } from '../../shared/page-configs/getConfigValue.js';
20
20
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
21
21
  import { isErrorPage } from '../../shared/error-page.js';
22
- import { addUrlComputedProps } from '../../shared/addUrlComputedProps.js';
22
+ import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.js';
23
23
  import { isAbortError } from '../../shared/route/abort.js';
24
24
  import { loadUserFilesServerSide } from '../runtime/renderPage/loadUserFilesServerSide.js';
25
25
  import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, setIsPrerenderering } from '../../shared/hooks/getHook.js';
@@ -240,9 +240,9 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
240
240
  prerenderContext.pageContexts.push(pageContextNew);
241
241
  if (pageContext) {
242
242
  objectAssign(pageContextNew, {
243
- _pageContextAlreadyProvidedByOnPrerenderHook: true,
244
- ...pageContext
243
+ _pageContextAlreadyProvidedByOnPrerenderHook: true
245
244
  });
245
+ objectAssign(pageContextNew, pageContext);
246
246
  }
247
247
  });
248
248
  })));
@@ -300,14 +300,11 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
300
300
  _prerenderContext: prerenderContext
301
301
  };
302
302
  const pageContextInit = {
303
- urlOriginal,
304
- ...prerenderContext.pageContextInit
303
+ urlOriginal
305
304
  };
305
+ objectAssign(pageContextInit, prerenderContext.pageContextInit);
306
306
  {
307
- const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext, {
308
- // We set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in a onPrerenderStart() hook, e.g. /examples/i18n/
309
- urlComputedPropsNonEnumerable: true
310
- });
307
+ const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext);
311
308
  objectAssign(pageContext, pageContextInitEnhanced);
312
309
  }
313
310
  return pageContext;
@@ -382,6 +379,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
382
379
  pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
383
380
  });
384
381
  const docLink = 'https://vike.dev/i18n#pre-rendering';
382
+ // Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
383
+ const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
385
384
  let result = await executeHook(() => hookFn({
386
385
  pageContexts: prerenderContext.pageContexts,
387
386
  // TODO/v1-release: remove warning
@@ -393,6 +392,7 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
393
392
  return prerenderContext.pageContexts;
394
393
  }
395
394
  }), onPrerenderStartHook, null);
395
+ restoreEnumerable();
396
396
  if (result === null || result === undefined) {
397
397
  return;
398
398
  }
@@ -430,9 +430,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
430
430
  hookName
431
431
  };
432
432
  }
433
- // Restore as URL computed props are lost when user makes a pageContext copy
434
- addUrlComputedProps(pageContext);
435
433
  });
434
+ addPageContextComputedUrl(prerenderContext.pageContexts);
436
435
  }
437
436
  async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete) {
438
437
  const globalContext = getGlobalContext();
@@ -714,3 +713,23 @@ function assertIsNotAbort(err, urlOr404) {
714
713
  assert(abortCall);
715
714
  assertUsage(false, `${pc.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${pc.cyan(abortCaller)} isn't supported for pre-rendered pages`);
716
715
  }
716
+ function makePageContextComputedUrlNonEnumerable(pageContexts) {
717
+ change(false);
718
+ return { restoreEnumerable, addPageContextComputedUrl };
719
+ function restoreEnumerable() {
720
+ change(true);
721
+ }
722
+ function addPageContextComputedUrl(pageContexts) {
723
+ // Add URL computed props to the user-generated pageContext copies
724
+ pageContexts.forEach((pageContext) => {
725
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContext);
726
+ objectAssign(pageContext, pageContextUrlComputed);
727
+ });
728
+ }
729
+ function change(enumerable) {
730
+ pageContexts.forEach((pageContext) => {
731
+ changeEnumerable(pageContext, 'urlPathname', enumerable);
732
+ changeEnumerable(pageContext, 'urlParsed', enumerable);
733
+ });
734
+ }
735
+ }
@@ -13,3 +13,4 @@ export * from '../../utils/assertNodeEnv.js';
13
13
  export * from '../../utils/pLimit.js';
14
14
  export * from '../../utils/assertPathFilesystemAbsolute.js';
15
15
  export * from '../../utils/isArray.js';
16
+ export * from '../../utils/changeEnumerable.js';
@@ -15,3 +15,4 @@ export * from '../../utils/assertNodeEnv.js';
15
15
  export * from '../../utils/pLimit.js';
16
16
  export * from '../../utils/assertPathFilesystemAbsolute.js';
17
17
  export * from '../../utils/isArray.js';
18
+ export * from '../../utils/changeEnumerable.js';