vike 0.4.171-commit-bb72501 → 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 (58) hide show
  1. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +12 -4
  2. package/dist/cjs/node/prerender/runPrerender.js +30 -11
  3. package/dist/cjs/node/prerender/utils.js +1 -0
  4. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
  5. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  6. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  7. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +22 -3
  8. package/dist/cjs/node/runtime/utils.js +1 -0
  9. package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
  10. package/dist/cjs/shared/route/index.js +2 -2
  11. package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
  12. package/dist/cjs/shared/utils.js +2 -0
  13. package/dist/cjs/utils/assert.js +1 -1
  14. package/dist/cjs/utils/assertNodeVersion.js +1 -1
  15. package/dist/cjs/utils/changeEnumerable.js +9 -0
  16. package/dist/cjs/utils/normalizeHeaders.js +13 -0
  17. package/dist/cjs/utils/objectAssign.js +1 -1
  18. package/dist/cjs/utils/objectDefineProperty.js +8 -0
  19. package/dist/cjs/utils/projectInfo.js +1 -1
  20. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +4 -2
  21. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  22. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +11 -7
  23. package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
  24. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +9 -4
  25. package/dist/esm/node/prerender/runPrerender.js +31 -12
  26. package/dist/esm/node/prerender/utils.d.ts +1 -0
  27. package/dist/esm/node/prerender/utils.js +1 -0
  28. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
  29. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -9
  30. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  31. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  32. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  33. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +55 -46
  34. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +23 -4
  35. package/dist/esm/node/runtime/utils.d.ts +1 -0
  36. package/dist/esm/node/runtime/utils.js +1 -0
  37. package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
  38. package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
  39. package/dist/esm/shared/route/index.d.ts +3 -3
  40. package/dist/esm/shared/route/index.js +2 -2
  41. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  42. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  43. package/dist/esm/shared/types.d.ts +24 -4
  44. package/dist/esm/shared/utils.d.ts +2 -0
  45. package/dist/esm/shared/utils.js +2 -0
  46. package/dist/esm/types/index.d.ts +1 -1
  47. package/dist/esm/utils/assert.js +1 -1
  48. package/dist/esm/utils/assertNodeVersion.js +1 -1
  49. package/dist/esm/utils/changeEnumerable.d.ts +2 -0
  50. package/dist/esm/utils/changeEnumerable.js +5 -0
  51. package/dist/esm/utils/normalizeHeaders.d.ts +1 -0
  52. package/dist/esm/utils/normalizeHeaders.js +9 -0
  53. package/dist/esm/utils/objectAssign.js +1 -1
  54. package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
  55. package/dist/esm/utils/objectDefineProperty.js +4 -0
  56. package/dist/esm/utils/projectInfo.d.ts +2 -2
  57. package/dist/esm/utils/projectInfo.js +1 -1
  58. package/package.json +2 -2
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.addSsrMiddleware = void 0;
4
7
  const renderPage_js_1 = require("../../runtime/renderPage.js");
5
8
  const utils_js_1 = require("../utils.js");
9
+ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
6
10
  function addSsrMiddleware(middlewares) {
7
11
  middlewares.use(async (req, res, next) => {
8
12
  if (res.headersSent)
@@ -13,15 +17,19 @@ function addSsrMiddleware(middlewares) {
13
17
  const { headers } = req;
14
18
  const pageContextInit = {
15
19
  urlOriginal: url,
16
- get userAgent() {
17
- (0, utils_js_1.assertWarning)(false, "pageContext.userAgent is deprecated in favor of pageContext.headers['user-agent']", {
20
+ headersOriginal: headers
21
+ };
22
+ Object.defineProperty(pageContextInit, 'userAgent', {
23
+ get() {
24
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
25
+ (0, utils_js_1.assertWarning)(false, `${picocolors_1.default.cyan('pageContext.userAgent')} is deprecated: use ${picocolors_1.default.cyan("pageContext.headers['user-agent']")} instead.`, {
18
26
  showStackTrace: true,
19
27
  onlyOnce: true
20
28
  });
21
29
  return headers['user-agent'];
22
30
  },
23
- headers
24
- };
31
+ enumerable: false
32
+ });
25
33
  let pageContext;
26
34
  try {
27
35
  pageContext = await (0, renderPage_js_1.renderPage)(pageContextInit);
@@ -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
@@ -147,7 +147,26 @@ function getPageContextInitEnhanced(pageContextInit, renderContext, { urlCompute
147
147
  _urlHandler: urlHandler,
148
148
  isClientSideNavigation
149
149
  });
150
- (0, addUrlComputedProps_js_1.addUrlComputedProps)(pageContextInitEnhanced, !urlComputedPropsNonEnumerable);
150
+ // pageContext.urlParsed
151
+ const pageContextUrlComputed = (0, getPageContextUrlComputed_js_1.getPageContextUrlComputed)(pageContextInitEnhanced);
152
+ (0, utils_js_1.objectAssign)(pageContextInitEnhanced, pageContextUrlComputed);
153
+ // pageContext.headers
154
+ {
155
+ let headers;
156
+ if (pageContextInit.headersOriginal) {
157
+ headers = (0, utils_js_1.normalizeHeaders)(pageContextInit.headersOriginal);
158
+ (0, utils_js_1.assertUsage)(!('headers' in pageContextInit), "You're defining pageContextInit.headersOriginal as well as pageContextInit.headers but you should only define pageContextInit.headersOriginal instead, see https://vike.dev/headers");
159
+ }
160
+ else if (pageContextInit.headers) {
161
+ headers = pageContextInit.headers;
162
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
163
+ (0, utils_js_1.assertWarning)(false, 'Setting pageContextInit.headers is deprecated: set pageContextInit.headersOriginal instead, see https://vike.dev/headers', { onlyOnce: true });
164
+ }
165
+ else {
166
+ headers = null;
167
+ }
168
+ (0, utils_js_1.objectAssign)(pageContextInitEnhanced, { headers });
169
+ }
151
170
  return pageContextInitEnhanced;
152
171
  }
153
172
  exports.getPageContextInitEnhanced = getPageContextInitEnhanced;
@@ -69,3 +69,4 @@ __exportStar(require("../../utils/formatHintLog.js"), exports);
69
69
  __exportStar(require("../../utils/joinEnglish.js"), exports);
70
70
  __exportStar(require("../../utils/isArrayOfStrings.js"), exports);
71
71
  __exportStar(require("../../utils/escapeHtml.js"), exports);
72
+ __exportStar(require("../../utils/normalizeHeaders.js"), exports);
@@ -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);
@@ -92,7 +92,7 @@ function assertWarning(condition, msg, { onlyOnce, showStackTrace }) {
92
92
  }
93
93
  globalObject.onBeforeLog?.();
94
94
  if (showStackTrace) {
95
- const err = new Error(msg);
95
+ const err = (0, createErrorWithCleanStackTrace_js_1.createErrorWithCleanStackTrace)(msg, numberOfStackTraceLinesToRemove);
96
96
  globalObject.showStackTraceList.add(err);
97
97
  globalObject.logger(err, 'warn');
98
98
  }
@@ -8,6 +8,6 @@ function assertNodeVersion() {
8
8
  if (!(0, isNodeJS_js_1.isNodeJS)())
9
9
  return;
10
10
  const version = process.versions.node;
11
- (0, assertVersion_js_1.assertVersion)('Node.js', version, '16.0.0');
11
+ (0, assertVersion_js_1.assertVersion)('Node.js', version, '18.0.0');
12
12
  }
13
13
  exports.assertNodeVersion = assertNodeVersion;
@@ -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;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeHeaders = void 0;
4
+ function normalizeHeaders(
5
+ /* This type is precise, too precise which can be annoying: e.g. cannot pass a string[][] argument because it doesn't match the more precise [string,string][] type.
6
+ headersOriginal ConstructorParameters<typeof Headers>[0]
7
+ */
8
+ headersOriginal) {
9
+ const headersStandard = new Headers(headersOriginal);
10
+ const headers = Object.fromEntries(headersStandard.entries());
11
+ return headers;
12
+ }
13
+ exports.normalizeHeaders = normalizeHeaders;
@@ -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-bb72501';
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) {
@@ -1,6 +1,7 @@
1
1
  export { addSsrMiddleware };
2
2
  import { renderPage } from '../../runtime/renderPage.js';
3
3
  import { assertWarning } from '../utils.js';
4
+ import pc from '@brillout/picocolors';
4
5
  function addSsrMiddleware(middlewares) {
5
6
  middlewares.use(async (req, res, next) => {
6
7
  if (res.headersSent)
@@ -11,15 +12,19 @@ function addSsrMiddleware(middlewares) {
11
12
  const { headers } = req;
12
13
  const pageContextInit = {
13
14
  urlOriginal: url,
14
- get userAgent() {
15
- assertWarning(false, "pageContext.userAgent is deprecated in favor of pageContext.headers['user-agent']", {
15
+ headersOriginal: headers
16
+ };
17
+ Object.defineProperty(pageContextInit, 'userAgent', {
18
+ get() {
19
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
20
+ assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
16
21
  showStackTrace: true,
17
22
  onlyOnce: true
18
23
  });
19
24
  return headers['user-agent'];
20
25
  },
21
- headers
22
- };
26
+ enumerable: false
27
+ });
23
28
  let pageContext;
24
29
  try {
25
30
  pageContext = await renderPage(pageContextInit);