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.
- package/dist/cjs/node/prerender/runPrerender.js +30 -11
- package/dist/cjs/node/prerender/utils.js +1 -0
- package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
- package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
- package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +4 -3
- package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
- package/dist/cjs/shared/route/index.js +2 -2
- package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
- package/dist/cjs/shared/utils.js +2 -0
- package/dist/cjs/utils/changeEnumerable.js +9 -0
- package/dist/cjs/utils/objectAssign.js +1 -1
- package/dist/cjs/utils/objectDefineProperty.js +8 -0
- package/dist/cjs/utils/projectInfo.js +1 -1
- package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +4 -2
- package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
- package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +11 -7
- package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
- package/dist/esm/node/prerender/runPrerender.js +31 -12
- package/dist/esm/node/prerender/utils.d.ts +1 -0
- package/dist/esm/node/prerender/utils.js +1 -0
- package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -9
- package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
- package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +27 -50
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +4 -3
- package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
- package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +50 -42
- package/dist/esm/shared/route/index.d.ts +3 -3
- package/dist/esm/shared/route/index.js +2 -2
- package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
- package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
- package/dist/esm/shared/types.d.ts +4 -4
- package/dist/esm/shared/utils.d.ts +2 -0
- package/dist/esm/shared/utils.js +2 -0
- package/dist/esm/types/index.d.ts +1 -1
- package/dist/esm/utils/changeEnumerable.d.ts +2 -0
- package/dist/esm/utils/changeEnumerable.js +5 -0
- package/dist/esm/utils/objectAssign.js +1 -1
- package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
- package/dist/esm/utils/objectDefineProperty.js +4 -0
- package/dist/esm/utils/projectInfo.d.ts +2 -2
- package/dist/esm/utils/projectInfo.js +1 -1
- 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
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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, {
|
|
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,
|
|
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.
|
|
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
|
|
7
|
-
(0, utils_js_1.assert)(pageContext.urlOriginal);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
19
|
+
(0, objectDefineProperty_js_1.objectDefineProperty)(pageContextUrlComputed, 'url', {
|
|
35
20
|
get: urlGetter,
|
|
36
21
|
enumerable: false,
|
|
37
22
|
configurable: true
|
|
38
23
|
});
|
|
39
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
126
|
-
|
|
111
|
+
(0, utils_js_1.changeEnumerable)(urlParsed, 'hashString', false);
|
|
112
|
+
(0, utils_js_1.changeEnumerable)(urlParsed, 'searchString', false);
|
|
127
113
|
if (!hashIsAvailable) {
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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
|
package/dist/cjs/shared/utils.js
CHANGED
|
@@ -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
|
|
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-
|
|
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
|
-
} &
|
|
15
|
-
|
|
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 {
|
|
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
|
-
|
|
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 = {
|
|
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(
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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 {
|
|
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
|
+
}
|